#1 newsun668

在缩写一个应用时,要求收到一个上传文件时进行相应的处理。网上有很多上传类,用过后觉得不太灵活。想到PHP5.3新增了闭包函数,于是就写了一个通用处理方法,发布于此,以便交流。

注意:下面代码使用了speedPHP框架  。
//
// 文件 uploadfile.php 编码utf-8
// 该文件放在项目的 \include 目录下

/*
    @func: 回调函数 形式是function(data)
*/

function uploadFile($func){
        if (NULL==$func) return 1;
        if (FALSE==is_callable($func)) return 2;

        $vfileinfo=array('name'=>'',
                        'error'=>'',
                        'size'=>0,
                        'tmp_name'=>'',
                        'type'=>''
                    );
        $error_msg=array(NULL,
            '上载文件超出php.ini中upload_max_filesize设置',
            '上载文件超表单域MAX_FILE_SIZE的设置',
             '文件只被部分上传',
             '没有上传任何文件'
        );

        foreach($_FILES as $vfiles){
            if (is_array($vfiles['name'])) { // 多文件        
                $n=count($vfiles['name']);
               
                for ($i=0;$i<$n;$i++){
                    $vfileinfo['name']=$vfiles['name'][$i];
                    $eid=$vfiles['error'][$i];
                    $vfileinfo['error']=$error_msg[$eid];
                    $vfileinfo['size']=$vfiles['size'][$i];
                    $vfileinfo['type']=$vfiles['type'][$i];
                    $vfileinfo['tmp_name']=$vfiles['tmp_name'][$i];
                    $func($vfileinfo);
                }
               
            }else{    //单文件
                $eid=intval($vfiles['error']);
                $vfiles['error']=$error_msg[$eid];
                $func($vfiles);
            }
        }
    }
   
   
/* 示例 */
//
// 控制器文件 test.php  编码utf-8
//
require(APP_PATH . "\includeploadfile.php");

class test extends spController
{
    function index(){
        $this->display('test.html');
        
    }

    //调用uploadFile,其中参数为闭包函数
    //data就是代表一个文件
    uploadFile(function($data){
        if (NULL==$data['error']) {
            $upfile=APP_PATH . '/upload/' . $data['name'];
            //为防止文件名含中文进行转码
            $upfilegb=iconv("utf-8", "gb2312",$upfile);

            if (!move_uploaded_file($data['tmp_name'],$upfilegb)) {
                 echo '
'.$data['name'] . '上传文件失败,不能移动文件到目标目录';
             }else {
                echo '
文件'.$data['name'] . '上传成功为' . $upfile;
            }
        }
    });

    }

}
?>


至于test.html中表单的文件域是什么名字,都不太重要了。
这样做法就比用一个上传类来得灵活,你可以对文件进行加水印、缩放等操作。
注意,php的版本必须5.3以上,否则不支持闭包函数。

2013-12-02 13:46:53