• PHP学习之文件上传类


    <?php
    $up = new Upload();
    $newPath = $up->uploadFile('fm');
    if ($newPath === false) {
        var_dump($up->errorNumber);
        var_dump($up->errorInfo);
    } else {
        echo $newPath;
    }
    
    class Upload
    {
        //文件上传保存路径
        protected $path = './upload/';
        //允许文件上传的后缀
        protected $allowSuffix = ['jpg', 'jpeg', 'gif', 'wbmp', 'png'];
        //允许文件上传的Mime类型
        protected $allowMime = ['image/jpeg', 'image/gif', 'image/wbmp', 'image/png'];
        //允许文件上传的文件最大大小
        protected $maxSize = 2000000;
        //是否启用随机名
        protected $isRandName = true;
        //加上文件前缀
        protected $prefix = 'up_';
    
        //自定义的错误号码和错误信息
        protected $errorNumber;
        protected $errorInfo;
    
        //文件的信息
        protected $oldName; //文件名
        protected $suffix; //文件后缀
        protected $size; //文件大小
        protected $mime; //文件mime
        protected $tmpName; //文件临时路径
        protected $newName; //文件新名字
    
        public function __construct($arr = [])
        {
            foreach ($arr as $key => $value) {
                $this->setOption($key, $value);
            }
        }
    
        public function __get($name)
        {
            if ($name == 'errorNumber') {
                return $this->errorNumber;
            } else if ($name == 'errorInfo') {
                return $this->getErrorInfo();
            }
        }
    
        /**
         * 判断这个$key是不是我的成员属性,如果是,则设置
         *
         * @param [type] $key
         * @param [type] $value
         * @return void
         */
        protected function setOption($key, $value)
        {
            //得到所有的成员属性
            $keys = array_keys(get_class_vars(__CLASS__));
            if (in_array($key, $keys)) {
                $this->$key = $value;
            }
        }
    
        /**
         * 文件上传函数
         * $key 就是你input框中的name属性值
         *
         * @param [type] $key
         * @return void
         */
        public function uploadFile($key)
        {
            //判断有没有设置路径  path
            if (empty($this->path)) {
                $this->setOption('errorNumber', -1);
                return false;
            }
            //判断该路径是否存在,是否可写
            if (!$this->check()) {
                $this->setOption('errorNumber', -2);
                return false;
            }
            //判断$_FILES里面的error信息是否为0,如果为0,说明文件信息在服务器端可以直接获取,提取信息保存到成员属性中
            $error = $_FILES[$key]['error'];
            if ($error) {
                $this->setOption('errorNumber', $error);
                return false;
            } else {
                //提取文件相关信息并且保存到成员属性中
                $this->getFileInfo($key);
            }
            //判断文件的大小、mime、后缀是否符合
            if (!$this->checkSize() || !$this->checkMime() || !$this->checkSuffix()) {
                return false;
            }
            //得到新的文件名字
            $this->newName = $this->createNewName();
            //判断是否是上传文件,并且移动上传文件
            if (is_uploaded_file($this->tmpName)) {
                if (move_uploaded_file($this->tmpName, $this->path . $this->newName)) {
                    return $this->path . $this->newName;
                } else {
                    $this->setOption('errorNumber', -7);
                    return false;
                }
            } else {
                $this->setOption('errorNumber', -6);
                return false;
            }
        }
    
        /**
         * 得到文件的新名字
         *
         * @return void
         */
        protected function createNewName()
        {
            //判断是否使用随机名
            if ($this->isRandName) {
                $name = $this->prefix . uniqid() . '.' . $this->suffix;
            } else {
                $name = $this->prefix . $this->oldName;
            }
            return $name;
        }
    
        /**
         * 判断该路径是否存在,是否可写
         *
         * @return void
         */
        protected function check()
        {
            //文件夹不存在或者不是目录。创建文件夹
            if (!file_exists($this->path) || !is_dir($this->path)) {
                return mkdir($this->path, 0777, true);
            }
            //判断文件是否可写
            if (!is_writeable($this->path)) {
                return chmod($this->path, 0777);
            }
            return true;
        }
    
        /**
         * 提取文件相关信息并且保存到成员属性中
         *
         * @param [type] $key
         * @return void
         */
        protected function getFileInfo($key)
        {
            // 得到文件名字
            $this->oldName = $_FILES[$key]['name'];
            //得到文件的mime类型
            $this->mime = $_FILES[$key]['type'];
            //得到文件临时路径
            $this->tmpName = $_FILES[$key]['tmp_name'];
            //得到文件大小
            $this->size = $_FILES[$key]['size'];
            //得到文件后缀
            $this->suffix = pathinfo($this->oldName)['extension'];
        }
    
        /**
         * 判断文件大小
         *
         * @return void
         */
        protected function checkSize()
        {
            if ($this->size > $this->maxSize) {
                $this->setOption('errorNumber', -3);
                return false;
            }
            return true;
        }
    
        /**
         * 判断文件的mime是否符合
         *
         * @return void
         */
        protected function checkMime()
        {
            if (!in_array($this->mime, $this->allowMime)) {
                $this->setOption('errorNumber', -4);
                return false;
            }
            return true;
        }
    
        /**
         * 判断文件的后缀是否符合
         *
         * @return void
         */
        protected function checkSuffix()
        {
            if (!in_array($this->suffix, $this->allowSuffix)) {
                $this->setOption('errorNumber', -5);
                return false;
            }
            return true;
        }
    
        /**
         * 返回错误信息
         *
         * @return void
         */
        protected function getErrorInfo()
        {
            switch ($this->errorNumber) {
                case -1:
                    $str = '文件路径没有设置';
                    break;
                case -2:
                    $str = '文件路径不是目录或者没有权限';
                    break;
                case -3:
                    $str = '文件大小超过指定范围';
                    break;
                case -4:
                    $str = '文件mime类型不符合';
                    break;
                case -5:
                    $str = '文件后缀不符合';
                    break;
                case -6:
                    $str = '不是上传文件';
                    break;
                case -7:
                    $str = '文件上传失败';
                    break;
                case 1:
                    $str = '文件超出php.ini设置大小';
                    break;
                case 2:
                    $str = '文件超出html设置大小';
                    break;
                case 3:
                    $str = '文件部分上传';
                    break;
                case 4:
                    $str = '没有文件上传';
                    break;
                case 6:
                    $str = '找不到临时文件';
                    break;
                case 7:
                    $str = '文件写入失败';
                    break;
            }
            return $str;
        }
    }

    测试代码:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>上传文件</title>
    </head>
    <body>
        <form action="Upload.php" method="post" enctype="multipart/form-data">
            <input type="file" name="fm">
            <br />
            <input type="submit" value="上传">
        </form>
    </body>
    </html>

    运行结果:

  • 相关阅读:
    springcloud
    redis实现Session
    深入理解Dip Ioc Di以及Ioc容器
    SQL Server 索引维护 索引碎片 填充因子
    SQL Server 非聚集索引的覆盖,连接交叉和过滤
    SQL Server 索引 聚集索引、非聚集索引、堆
    T-SQL存储过程
    T-SQl 批处理
    T-SQl 游标
    T-SQL 控制流语句
  • 原文地址:https://www.cnblogs.com/shengChristine/p/10955127.html
Copyright © 2020-2023  润新知