PHP封装文件上传

(1)注意事项:

①创建表单时加上enctype="multipart/form-data",来提示浏览器不仅可以上传文本流,还能上传二进制流文件

②$_FILES接受上传文件信息,输出后如下

array(1) {
  ["pic"]=>
  array(5) {
    ["name"]=>
    string(36) "008ba1edbe4c0365a538b71189546615.jpg"
    ["type"]=>
    string(10) "image/jpeg"
    ["tmp_name"]=>
    string(53) "C:UsersAdministratorAppDataLocalTempphp4194.tmp"
    ["error"]=>
    int(0)
    ["size"]=>
    int(265610)
  }
}

下面直接上代码,具体详解已经在代码注释过了。相关的函数可以参考文章 PHP常见函数

(2)代码解析

<meta charset="utf-8">
<?php
    abstract class aUpload{
        public $allowExt = array('jpg','jpeg','png','rar');
        public $maxSize = 1;//最大上传大小,以M为单位
        public $error = '';//错误信息
        /*
        * 分析$_FILES中$name的信息,比如_FILES中的['pic']
        * @param string $name 表单中file表单项的name值
        * @param array 上传文件的信息,包含(tmp_name,oname[不包含后缀的文件名],ext[后缀名],size)
        */
        abstract public function getInfo($name);
        /*
        *创建目录,在当前网站的根目录中按年月日创建目录
        *@return string 目录路径,例/upload/2015/0330
        */
        abstract public function createDir();
        /*
        *生成随机文件名
        *@param int $len 随机字符串的长度
        *@return string 指定长度的随机字符串
        */
        abstract public function randStr($len=8);
        /*
        *上传文件
        *@param string $name 表单中file表单项的name值 
        *@return string 上传文件的路径,从web根目录开始计,如/upload/2015/0330/a.jpg
        */
        abstract public function up($name);
        /*
         判断$_FILES[$name]
         调用getInfo分析文件大小,后缀等
         调用checkType
         调用checkSize
         调用creatDir
         调用randStr生成随机文件名
         移动,返回路径
        */
         /**
         检测文件类型,如只允许jpg,png,rar,不允许exe
         *@param $ext 文件的后缀
         *@return boolean
         */
        abstract protected function checkType($ext);
        /*
        *检测文件的大小
        *@param $size 文件的大小
        *@return boolean 
        */
        abstract protected function checkSize($size);
        /*
        *读取错误信息
        */
        public function getError(){
            return $this->error;
        }
    }
    class Upload extends aUpload{
         //获取文件信息
        public function getInfo($name){
            // $_FILES接受的上传文件信息(数组),接受完毕后基本上上传完成。
            //剩余步骤:检测安全性、起别名、缓存移动到硬盘等
            return $_FILES[$name];
        }
        //创建文件存储路径
        public function createDir(){
            date_default_timezone_set('PRC');
            $dir = 'upload/'.date('Y/m',time());
            if (!is_dir($dir)) {
                mkdir($dir,0777,true);
            }
            return $dir;
        }
        //生成随机字符串,用作文件名(检测文件不重复)
        public function randStr($len=8){
            return md5(time()).mt_rand(10,100);
        }

        //检测文件类型,即后缀名(一般方式:截取后缀名进行判断,但不安全,因为后缀名可以随意改。若病毒改名.txt,则上传后可能会执行)
        //因为Linux环境下不检测后缀名。所以我们用$_FILES[files]进行检测
        protected function checkType($ext){
            return in_array($ext,$this->allowExt);
        }
        //获取传过来的文件大小,参数size为字节单位,需要转换
        protected function checkSize($size){
            return $size<$this->maxSize*1024*1024;
        }
        //上传
        public function up($name){
            if (!isset($_FILES[$name])) {
                die("上传为空");
            }
            $info = $this->getInfo($name);
            $upfile = ltrim(strrchr($info['name'], '.'),'.');//后缀名
            if (!$this->checkType($upfile)) {
                die("文件类型错误");
            }
            if (!$this->checkSize($info['size'])){
                die("文件过大,超出限制");
            }
            //以上都符合后开始存到硬盘
            $dir = $this->createDir();//路径
            $filename = $this->randStr().'.'.$upfile;//文件名+后缀名
            //$_FILES["file"]["tmp_name"] - 存储在服务器的文件的临时副本的名称
           if(move_uploaded_file($info['tmp_name'], $dir.'/'.$filename)){//返回文件路径和文件名
                $data['path'] = $dir;//文件路径
                $data['filename'] = $filename;//文件名
                return $data;
           }else{
                echo "上传失败";
           }
        }
    }
    $file = new Upload();
    $upload = $file->up('pic');
    var_dump($upload);//返回数组,上传文件的文件名和路径
?>

上传后返回数组:

array(2) {
  ["path"]=>
  string(14) "upload/2018/03"
  ["filename"]=>
  string(38) "250e8353fa1293d1e0f571317e28521f87.jpg"
}

.

原文地址:https://www.cnblogs.com/fightjianxian/p/8655645.html