#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