首页 > 代码库 > PHP 图片上传工具类(支持多文件上传)

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

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

技术分享
<?phpclass 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="http://www.mamicode.com/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/‘);//进行单文件上传操作,上传成功返回trueif ($uploadTool->acceptSingleFile()) {        //获取上传后的文件路径,并用img标签显示    echo "<img src=http://www.mamicode.com/‘{$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());

多文件上传测试:

技术分享

 

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