• PHP 图片上传工具类(支持多文件上传)


    ====================ImageUploadTool========================

    <?php
    
    class ImageUploadTool
    {
        private $file;          //文件信息
        private $fileList;      //文件列表
        private $inputName;     //标签名称
        private $uploadPath;    //上传路径
        private $fileMaxSize;   //最大尺寸
        private $uploadFiles;   //上传文件
        //允许上传的文件类型
        private $allowExt = array('bmp', 'jpg', 'jpeg', 'png', 'gif');
    
        /**
         * ImageUploadTool constructor.
         * @param $inputName input标签的name属性
         * @param $uploadPath 文件上传路径
         */
        public function __construct($inputName, $uploadPath)
        {
            $this->inputName = $inputName;
            $this->uploadPath = $uploadPath;
            $this->fileList = array();
            $this->file = $file = array(
                'name' => null,
                'type' => null,
                'tmp_name' => null,
                'size' => null,
                'errno' => null,
                'error' => null
            );
        }
    
        /**
         * 设置允许上传的图片后缀格式
         * @param $allowExt 文件后缀数组
         */
        public function setAllowExt($allowExt)
        {
            if (is_array($allowExt)) {
                $this->allowExt = $allowExt;
            } else {
                $this->allowExt = array($allowExt);
            }
        }
    
        /**
         * 设置允许上传的图片规格
         * @param $fileMaxSize 最大文件尺寸
         */
        public function setMaxSize($fileMaxSize)
        {
            $this->fileMaxSize = $fileMaxSize;
        }
    
        /**
         * 获取上传成功的文件数组
         * @return mixed
         */
        public function getUploadFiles()
        {
            return $this->uploadFiles;
        }
    
        /**
         * 得到文件上传的错误信息
         * @return array|mixed
         */
        public function getErrorMsg()
        {
            if (count($this->fileList) == 0) {
                return $this->file['error'];
            } else {
                $errArr = array();
                foreach ($this->fileList as $item) {
                    array_push($errArr, $item['error']);
                }
                return $errArr;
            }
        }
    
        /**
         * 初始化文件参数
         * @param $isList
         */
        private function initFile($isList)
        {
            if ($isList) {
                foreach ($_FILES[$this->inputName] as $key => $item) {
                    for ($i = 0; $i < count($item); $i++) {
                        if ($key == 'error') {
                            $this->fileList[$i]['error'] = null;
                            $this->fileList[$i]['errno'] = $item[$i];
                        } else {
                            $this->fileList[$i][$key] = $item[$i];
                        }
                    }
                }
            } else {
                $this->file['name'] = $_FILES[$this->inputName]['name'];
                $this->file['type'] = $_FILES[$this->inputName]['type'];
                $this->file['tmp_name'] = $_FILES[$this->inputName]['tmp_name'];
                $this->file['size'] = $_FILES[$this->inputName]['size'];
                $this->file['errno'] = $_FILES[$this->inputName]['error'];
            }
        }
    
        /**
         * 上传错误检查
         * @param $errno
         * @return null|string
         */
        private function errorCheck($errno)
        {
            switch ($errno) {
                case UPLOAD_ERR_OK:
                    return null;
                case UPLOAD_ERR_INI_SIZE:
                    return '文件尺寸超过服务器限制';
                case UPLOAD_ERR_FORM_SIZE:
                    return '文件尺寸超过表单限制';
                case UPLOAD_ERR_PARTIAL:
                    return '只有部分文件被上传';
                case UPLOAD_ERR_NO_FILE:
                    return '没有文件被上传';
                case UPLOAD_ERR_NO_TMP_DIR:
                    return '找不到临时文件夹';
                case UPLOAD_ERR_CANT_WRITE:
                    return '文件写入失败';
                case UPLOAD_ERR_EXTENSION:
                    return '上传被扩展程序中断';
            }
        }
    
        /**
         * 上传文件校验
         * @param $file
         * @throws Exception
         */
        private function fileCheck($file)
        {
            //图片上传过程是否顺利
            if ($file['errno'] != 0) {
                $error = $this->errorCheck($file['errno']);
                throw new Exception($error);
            }
            //图片尺寸是否符合要求
            if (!empty($this->fileMaxSize) && $file['size'] > $this->fileMaxSize) {
                throw new Exception('文件尺寸超过' . ($this->fileMaxSize / 1024) . 'KB');
            }
            //图片类型是否符合要求
            $ext = pathinfo($file['name'], PATHINFO_EXTENSION);
            if (!in_array($ext, $this->allowExt)) {
                throw new Exception('不符合要求的文件类型');
            }
            //图片上传方式是否为HTTP
            if (!is_uploaded_file($file['tmp_name'])) {
                throw new Exception('文件不是通过HTTP方式上传的');
            }
            //图片是否可以读取
            if (!getimagesize($file['tmp_name'])) {
                throw new Exception('图片文件损坏');
            }
            //检查上传路径是否存在
            if (!file_exists($this->uploadPath)) {
                mkdir($this->uploadPath, null, true);
            }
        }
    
        /**
         * 单文件上传,成功返回true
         * @return bool
         */
        public function acceptSingleFile()
        {
            $this->initFile(false);
            try {
                $this->fileCheck($this->file);
                $md_name = md5(uniqid(microtime(true), true)) . '.' . pathinfo($this->file['name'], PATHINFO_EXTENSION);
                if (move_uploaded_file($this->file['tmp_name'], $this->uploadPath . $md_name)) {
                    $this->uploadFiles = array($this->uploadPath . $md_name);
                } else {
                    throw new Exception('文件上传失败');
                }
            } catch (Exception $e) {
                $this->file['error'] = $e->getMessage();
            } finally {
                if (file_exists($this->file['tmp_name'])) {
                    unlink($this->file['tmp_name']);
                }
            }
            return empty($this->file['error']) ? true : false;
        }
    
        /**
         * 多文件上传,全部成功返回true
         * @return bool
         */
        public function acceptMultiFile()
        {
            $this->initFile(true);
            $this->uploadFiles = array();
            for ($i = 0; $i < count($this->fileList); $i++) {
                try {
                    $this->fileCheck($this->fileList[$i]);
                    $ext = pathinfo($this->fileList[$i]['name'], PATHINFO_EXTENSION);
                    $md_name = md5(uniqid(microtime(true), true)) . '.' . $ext;
                    if (move_uploaded_file($this->fileList[$i]['tmp_name'], $this->uploadPath . $md_name)) {
                        array_push($this->uploadFiles, $this->uploadPath . $md_name);
                    } else {
                        throw new Exception('文件上传失败');
                    }
                } catch (Exception $e) {
                    $this->fileList[$i]['error'] = $e->getMessage();
                } finally {
                    if (file_exists($this->fileList[$i]['tmp_name'])) {
                        unlink($this->fileList[$i]['tmp_name']);
                    }
                }
            }
            foreach ($this->fileList as $item) {
                if (!empty($item['error'])) {
                    return false;
                }
            }
            return true;
        }
    }
    ImageUploadTool.class.php

    =======================单文件上传===========================

    首先创建一个简单HTML表单:

    <form action="tool_test.php" method="post" enctype="multipart/form-data">
        <!--通过表单隐藏域限制上传文件的最大值-->
        <!--<input type="hidden" name="MAX_FILE_SIZE" value="204800">-->
        <!--通过accept属性限制上传文件类型-->
        <!--<input type="hidden" name="myfile" accept="image/jpeg,image/png">-->
    
        <label for="upload">请选择上传的文件</label>
        <input type="file" id="upload" name="myfile"><br>
        <input type="submit" value="上传文件">
    </form>

    再创建一个tool_test.php文件:

    <?php
    //引用图片上传工具
    require_once 'ImageUploadTool.class.php';
    
    //初始化上传工具,参数(input表单name属性 , 文件上传路径)
    $uploadTool = new ImageUploadTool('myfile', 'file/');
    
    //进行单文件上传操作,上传成功返回true
    if ($uploadTool->acceptSingleFile()) {
        
        //获取上传后的文件路径,并用img标签显示
        echo "<img src='{$uploadTool->getUploadFiles()[0]}'/>";
        
    } else {
        
        //打印错误信息
        echo $uploadTool->getErrorMsg();
        
    }

    =======================文件上传===========================

    首先创建一个简单HTML表单:

    需要在<input type="file">标签的name属性后面追加“[]”,并且添加 multiple 属性

    <form action="tool_test.php" method="post" enctype="multipart/form-data">
        <label for="upload">请选择上传的文件</label>
        <input type="file" id="upload" name="myfile[]" multiple><br>
        <input type="submit" value="上传文件">
    </form>

    再创建一个tool_test.php文件:

    <?php
    //引用图片上传工具
    require_once 'ImageUploadTool.class.php';
    
    //初始化上传工具,参数(input表单name属性 , 文件上传路径)
    $uploadTool = new ImageUploadTool('myfile', 'file/');
    
    //设置允许上传的文件后缀类型
    $uploadTool->setAllowExt(array('png', 'jpg'));
    
    //设置上传文件的最大尺寸
    $uploadTool->setMaxSize(1024 * 200);
    
    //进行多文件上传操作,全部上传成功返回true
    $uploadTool->acceptMultiFile();
    
    //打印所有上传成功的图片路径
    print_r($uploadTool->getUploadFiles());
    
    //打印所有上传失败的错误信息
    print_r($uploadTool->getErrorMsg());

    多文件上传测试:

  • 相关阅读:
    (Java实现) 删数问题
    (Java实现) 车站
    (Java实现) 活动选择
    (Java实现) 过河卒
    (Java实现) 美元汇率
    (Java实现) 零件分组
    (Java实现) 图的m着色问题
    (Java实现) 数塔问题
    Java实现 蓝桥杯VIP 算法训练 数的划分
    DirectUI的消息流转
  • 原文地址:https://www.cnblogs.com/woider/p/5847821.html
Copyright © 2020-2023  润新知