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; } }
=======================单文件上传===========================
首先创建一个简单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 图片上传工具类(支持多文件上传)的主要内容,如果未能解决你的问题,请参考以下文章