• 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"
    }

    .

  • 相关阅读:
    看着四年前的代码,那时奋斗的模样,百感滋味
    操作系统中进程调度策略有哪几种?
    Linux操作系统及调用接口
    wpf 图像浏览(平移,缩放)
    C# double小数点的取舍
    C# 读写16位tif图片灰度数据
    WPF Slider滑块的使用
    WPF使用MVVMLight的ViewModel 访问控件的属性方法事件以及多页面传递信息
    苹果手机小米手环5收不到微信QQ消息提醒的解决办法
    AD覆铜设置规则
  • 原文地址:https://www.cnblogs.com/fightjianxian/p/8655645.html
Copyright © 2020-2023  润新知