PHP文件上传类(支持多文件上传)


下载:文件上传类

此文件上传类支持多文件上传,解决多文件上传时,input name="files[]" 表单名为数组时出现出现错误的情况。实例化时需要传递一个数组参数(不传参将不限制上传类型和大小,默认保存路径./upload)

<?php 
/**
*    Upload文件上传类(可多文件上传)
*    
*    Be the best of whatever you are!
*   实例化时需要传递一个数组参数(不传参将不限制上传类型和大小,默认保存路径./upload) 
*   调用方式:
*   $arr=array('type'=>'jpg,excel,html','maxSize' => 20,'path'=>'./data/img');
*   $up=new Upload($arr);
*   $fileName_arr=$up->upload() //返回一个数组 上传成功的图像名字
*   
* @author: Dzer <Email:358654744@qq.com Blog:dzer.me>
* @version: 2014-12-24 15:21:12
* @Last Modified time: 2014-12-28 16:21:24
*/
class Upload{
    //要求:可控制上传类型(判断后缀),上传大小,保存路径,
    private $config=array(
        'type'=>array(),    //允许上传类型
        'maxSize'=>0,        //允许上传最大大小 0就不限制 单位M
        'path'=>'./upload'  //保存路径
        );
    protected $error=array();     //错误消息保存 
    public $saveName=null;     //返回成功保存的文件名
    /**
     * __construct()    
     
     * @param array $arr   设置上传规则
     * array('type'=>'jpg,excel,html','maxSize' => 20,'path'=>'./data/img')
     */
    public function __construct($arr=array()){
        $this->config=array_merge($this->config,$arr);
        if(!empty($this->config['type'])){
            $type=str_replace(' '''$this->config['type']);
            $type=strtolower($type);
            $this->type=explode(','$type);
        }
    }
    /**
     * __set() 可单独设置上传规则
     
     * @param mixed $k
     * @param mixed $v
     * @return mixed
     */
    public function __set($k,$v){
        if(isset($this->config[$k])){
            $this->config[$k]=$v;
        }else{
            return null;
        }
    }
    /**
     * upload() 上传文件
     
     * @param array $files     
     * @return array   返回成功上传的文件名的数组
     */
    public function upload($files=''){
        if($files===''){
            $files=$_FILES;  //可以指定上传的文件,如没有指定就默认$_FILES
        }
        if(empty($files)){
            $this->error[]='没有上传文件';
        }
        //防止多文件上传陷阱 转化数组  上传表单名为数组 例如name='pic[]'
         /*Array(
                [files] => Array
                    (
                        [name] => Array
                            (
                                [0] => l3wC.jpg
                                [1] => l3wC.jpg
                                [2] => 
                            )
                        
                                )*/
        $files_arr=array();
        foreach ($files as $k1 => $v1) {
            if(!is_array($v1['name'])){
                $files_arr[$k1]=$v1;
                continue;
            }
            foreach ($v1 as $k2 => $v2) {
                foreach ($v2 as $k3 => $v3) {
                    $files_arr[$k3][$k2]=$v3;
                }
            }
        }
        $files=$files_arr;
        
        //循环上传文件
        foreach ($files as $k => $v) {
            //判断error是否上传成功
            if(!$this->checkError($v['error'],$v['name'])){
                continue;
            }
            //获取文件后缀
            $ext=$this->extension($v['name']);
            //判断文件类型是否允许上传
            if(!$this->checkType($ext)){
                $this->error[]=$v['name'].' 禁止该文件类型上传';
                continue;
            }
            //判断文件大小
            if($this->config['maxSize']!=0 && $v['size'] > $this->config['maxSize'] * 1024 * 1024){
                $this->error[]= $v['name'].' 该文件大于'.$this->config['maxSize'].'M';
                continue;
            }
            //创建目录
            if(!$this->cjDir()){
                $this->error[]='创建目录出错';
                continue;
            }
            $filename=$this->fileName($ext);
            if(move_uploaded_file($v['tmp_name'],$filename)){
                $this->saveName[]=$filename;
            }else{
                $this->error[]='文件保存出错';
                continue;
            }
        }
        return $this->saveName;   //返回上传成功的文件名数组
    }
    /**
     * checkError() 检查error并记录错误
     
     * @param int $error
     * @param string $filename
     * @return bool
     */
    public function checkError($error,$filename){
        /*其值为 0,没有错误发生,文件上传成功。
        其值为 1,上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值。
        其值为 2,上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值。
        其值为 3,文件只有部分被上传。
        其值为 4,没有文件被上传。
        其值为 6,找不到临时文件夹。PHP 4.3.10 和 PHP 5.0.3 引进。
        其值为 7,文件写入失败。PHP 5.1.0 引进。*/
        switch($error){
            case 0:
                return true;
                break;
            case 1:
                $this->error[]=$filename.' 上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值。';
                return false;
                break;
            case 2:
                $this->error[]=$filename.' 上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值';
                return false;
                break;
            case 3:
                $this->error[]=$filename.' 文件只有部分被上传';
                return false;
                break;
            case 4:
                $this->error[]=$filename.' 没有文件被上传';
                return false;
                break;
            case 6:
                $this->error[]=$filename.' 找不到临时文件夹';
                return false;
                break;
            case 7:
                $this->error[]='文件写入失败';
                return false;
                break;
            default:
                return false;
        }
    }
    /**
     * fileName() 获取文件名(包含路径)
     
     * @param mixed $ext 获取后缀名
     * @return string 返回文件名
     */
    public function fileName($ext){
        $filename=$this->config['path'].'/'.date('YmdHis').rand(10,99).'.'.$ext;
        return $filename;
    }
    /**
     * cjDir() 创建目录
     
     * @return bool
     */
    public function cjDir(){
        if(empty($this->config['path'])){
            $this->config['path']='./upload';
        }
        if(!is_dir($this->config['path'])){
            return mkdir($this->config['path'],'0777',true);
        }else{
            return true;
        }
    }
    /**
     * extension() 获取文件后缀并小写(不包含.)
     
     * @param string $path 获取一个文件的地址
     * @return string
     */
    public function extension($path){
        return strtolower(pathinfo($path,PATHINFO_EXTENSION));
    }
    /**
     * checkType() 检查文件类型是否为规定类型 
     
     * @param string $extension
     * @return bool
     */
    public function checkType($extension){
        if(empty($this->config['type'])){
            return true;    
        }else{
            return in_array($extension$this->config['type']);
        }
        
    }
    public function showError(){
        return $this->error;
    }
}
?>

常常是最后一把钥匙打开了门