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());

多文件上传测试:

时间: 2024-08-06 21:23:00

PHP 图片上传工具类(支持多文件上传)的相关文章

spring mvc 文件上传工具类

虽然文件上传在框架中,已经不是什么困难的事情了,但自己还是开发了一个文件上传工具类,是基于springmvc文件上传的. 工具类只需要传入需要的两个参数,就可以上传到任何想要上传的路径: 参数1:HttpServletRequest request 参数2:String storePath   //文件存储相对路径 ,例如:"/upload","/image","/local/file" 返回值:上传到服务器的相对路径 一:代码实现 import

文件上传工具类 UploadUtil.java

package com.util; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; import java.util

文件上传工具类——傻瓜式上传文件

转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6128382.html 在前面  (http://www.cnblogs.com/ygj0930/p/6073505.html)  我们提到过Javaweb开发的文件上传功能的实现,需要借助第三方jar包,并且要创建factory呀.设置临时文件区路径呀等等,十分繁琐.而作为一个开发人员,不可能每次实现文件上传时都从头到尾做那么多工序.这时候,我们可以把这些繁琐的工作封装起来,把一个个功能做成以供调用的方法.

文件上传工具类(重命名,以及判断类型)

public class FileUploadUtil {     public static final List<String> ALLOW_TYPES = Arrays.asList(             "image/jpg","image/jpeg","image/png","image/gif"     ); //文件重命名     public static String rename(Strin

高可用的Spring FTP上传下载工具类(已解决上传过程常见问题)

前言 最近在项目中需要和ftp服务器进行交互,在网上找了一下关于ftp上传下载的工具类,大致有两种. 第一种是单例模式的类. 第二种是另外定义一个Service,直接通过Service来实现ftp的上传下载. 这两种感觉都有利弊. 第一种实现了代码复用,但是配置信息全需要写在类中,维护比较复杂. 第二种如果是spring框架,可以通过propertis文件,动态的注入配置信息,但是又不能代码复用. 所以我打算自己实现一个工具类,来把上面的两种优点进行整合.顺便把一些上传过程中一些常见的问题也给解

图片压缩java工具类

package com.net.util; import java.awt.Image; import java.awt.image.BufferedImage; import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; import javax.imageio.ImageIO; import javax.servlet.http.HttpServletRequest; import org

Android开发调试日志工具类[支持保存到SD卡]

直接上代码: package com.example.callstatus; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter; import java.io.StringWriter; import java.net.UnknownHostException; import java.text.SimpleDateFormat; impor

支持多文件上传的jQuery文件上传插件Uploadify

支持多文件上传的jQuery文件上传插件Uploadify,目前此插件有两种版本即Flash版本和HTML5版本,对于HTML5版本会比较好的支持手机浏览器,避免苹果手机Safari浏览器不支持Flash,主要特性:支持多文件上传.HTML5版本可拖拽上传.实时上传进度条显示.强大的参数定制功能,如文件大小.文件类型.按钮图片定义.上传文件脚本等. Flash版本使用方法: 1.加载JS和CSS ? 1 2 3 <script src="jquery/1.7.1/jquery.min.js

强大的支持多文件上传的jQuery文件上传插件Uploadify

支持多文件上传的jQuery文件上传插件Uploadify,目前此插件有两种版本即Flash版本和HTML5版本,对于HTML5版本会比较好的支持手机浏览器,避免苹果手机Safari浏览器不支持Flash,主要特性:支持多文件上传.HTML5版本可拖拽上传.实时上传进度条显示.强大的参数定制功能,如文件大小.文件类型.按钮图片定义.上传文件脚本等. Flash版本使用方法: 1.加载JS和CSS ? 1 2 3 <script src="jquery/1.7.1/jquery.min.js

文件上传类,实现文件上传功能

/** *==================================================================  * upload.class.php 文件上传类,实现文件上传功能 * 2013年3月27日0:37:15 *================================================================== */ class Upload{    private $path;   //文件上传目录    privat