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

Posted woider

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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());

多文件上传测试:

 

以上是关于PHP 图片上传工具类(支持多文件上传)的主要内容,如果未能解决你的问题,请参考以下文章

php过滤上传类型,只上传图片类型文件

php上传文件(上传后显示图片)

php 图片操作类,支持生成缩略图,添加水印,上传缩略图

php中上传多张图片,如何解决?

php图片上传为啥要base64上传

关于thinkphp图片上传问题