====================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 图片上传工具类(支持多文件上传)的更多相关文章

  1. Jquery图片上传组件,支持多文件上传

    Jquery图片上传组件,支持多文件上传http://www.jq22.com/jquery-info230jQuery File Upload 是一个Jquery图片上传组件,支持多文件上传.取消. ...

  2. ajaxfileupload多文件上传 - 修复只支持单个文件上传的bug

    搜索: jquery ajaxFileUpload AjaxFileUpload同时上传多个文件 原生的AjaxFileUpload插件是不支持多文件上传的,通过修改AjaxFileUpload少量代 ...

  3. spring mvc 文件上传工具类

    虽然文件上传在框架中,已经不是什么困难的事情了,但自己还是开发了一个文件上传工具类,是基于springmvc文件上传的. 工具类只需要传入需要的两个参数,就可以上传到任何想要上传的路径: 参数1:Ht ...

  4. spring boot 文件上传工具类(bug 已修改)

    以前的文件上传都是之前前辈写的,现在自己来写一个,大家可以看看,有什么问题可以在评论中提出来. 写的这个文件上传是在spring boot 2.0中测试的,测试了,可以正常上传,下面贴代码 第一步:引 ...

  5. 文件上传工具类 UploadUtil.java

    package com.util; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import ja ...

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

    前言 最近在项目中需要和ftp服务器进行交互,在网上找了一下关于ftp上传下载的工具类,大致有两种. 第一种是单例模式的类. 第二种是另外定义一个Service,直接通过Service来实现ftp的上 ...

  7. FastDFS 文件上传工具类

    FastDFS文件上传工具类 import org.csource.common.NameValuePair; import org.csource.fastdfs.ClientGlobal; imp ...

  8. php 图片上传 并返回上传文件位置 支持多文件上传

    <?php /** * Created by PhpStorm. * User: DY040 * Date: 2018/4/26 * Time: 13:23 */ echo '<pre&g ...

  9. 表单多文件上传样式美化 && 支持选中文件后删除相关项

    开发中会经常涉及到文件上传的需求,根据业务不同的需求,有不同的文件上传情况. 有简单的单文件上传,有多文件上传,因浏览器原生的文件上传样式及功能的支持度不算太高,很多时候我们会对样式进行美化,对功能进 ...

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

    直接上代码: package com.example.callstatus; import java.io.File; import java.io.FileWriter; import java.i ...

随机推荐

  1. Spring + SpringMVC + Druid + JPA(Hibernate impl) 给你一个稳妥的后端解决方案

    最近手头的工作不太繁重,自己试着倒腾了一套用开源框架组建的 JavaWeb 后端解决方案. 感觉还不错的样子,但实践和项目实战还是有很大的落差,这里只做抛砖引玉之用. 项目 git 地址:https: ...

  2. MobaXterm.9.4|ssh连接工具

    在狂博客中,无意发现的一款集成的远程连接工具MobaXterm.9.4,官方有个人免费版,和企业版!有连接数限制,此款为破解版.感觉还挺不错的,ssh远程连接工具! 01.主界面  02.可选的远程 ...

  3. iOS常用开发技巧

    iOS开发过程中,总有那么一些个小问题让人纠结,它们不会让程序崩溃,但是会让人崩溃.除此之外,还将分享一些细节现在我通过自己的总结以及从其他地方的引用,来总结一下一些常见小问题. 本篇长期更新,多积累 ...

  4. windows下安装kibana出 "EPERM: operation not permitted

    D:\kibana-\bin>kibana-plugin install file:///x-pack-5.0.0.zip Attempting to transfer from file:// ...

  5. ReactNative 根据scrollView/listview滑动距离动态修改NavBar颜色

    我们常见某些APP上滑的时候,NavBar颜色会从透明渐变为某种颜色 原理非常简单,根据scrollView的回调动态修改NavBar的透明度即可. 在RN中,尤其是ListView中这个回调不是很好 ...

  6. php+swoole+websocket

    //创建websocket服务器对象,监听0.0.0.0:9502端口 $ws = new swoole_websocket_server("0.0.0.0", 9502); // ...

  7. Linux的3个文件时间

    文件的三个时间相信大家都已经很熟悉windows操作系统了,当我们在windows系统下创建一个文件时,系统同时会为这个文件建立相关的参数去描述这个文件,如图: 这些参数包括文件的大小,文件类型,位置 ...

  8. Js异步上传加进度条

    http://www.ruanyifeng.com/blog/2012/09/xmlhttprequest_level_2.html http://www.cnblogs.com/yuanlong10 ...

  9. ORACLE中的LTRIM、RTRIM和TRIM

    LTRIM.RTRIM和TRIM在ORACLE中的用法:1.LTRIM(C1,C2)其中C1和C2都可以字符串,例如C1是'Miss Liu',C2'MisL'等等.这是第一个和SQL SERVER不 ...

  10. IDF-CTF-牛刀小试-啥?

    本人属于Web安全这一块的小白,稍微了作了一下知识补充就开始了CTF,其中的有很多不懂但看多了网上大牛的解题办法和思路.便开始有了一些要想动手记录的冲动,希望大家共同进步学习,本文能对读者有所帮助~ ...