PHP的多文件上传
提交表单的页面
upload.php
- <!doctype html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <title>文件上传</title>
- </head>
- <body>
- <form action="doAction.php" method="post" enctype="multipart/form-data">
- 请选择您要上传的文件:<input type="file" name="myFile[]"/><br/>
- 请选择您要上传的文件:<input type="file" name="myFile[]"/><br/>
- 请选择您要上传的文件:<input type="file" name="myFile[]"/><br/>
- 请选择您要上传的文件:<input type="file" name="myFile[]"/><br/>
- 请选择您要上传的文件:<input type="file" name="myFile[]"/><br/>
- 请选择您要上传的文件:<input type="file" name="myFile[]"/><br/>
- <input type="submit" value="上传文件"/>
- </form>
- </body>
- </html>
多文件上传类
Upload2.class.php
- <?php
- /**
- * Created by PhpStorm.
- * User: DreamBoy
- * Date: 2016/4/9
- * Time: 9:24
- */
- error_reporting(0);
- class Upload2 {
- protected $fileName; //POST请求时文件的name值
- protected $maxSize; //文件上传的最大大小
- protected $allowMime; //允许上传的文件类型
- protected $allowExt; //允许上传的文件类型
- protected $uploadPath; //文件上传的路径
- protected $imgFlag; //标志是否要求上传的文件为真实图片
- protected $fileInfos; //所有文件信息
- protected $uploadRes; //上传文件的结果
- protected $error; //记录系统错误号
- protected $err = array( //错误号及错误类型
- '000' => '文件上传成功',
- '001' => '超过了PHP配置文件中upload_max_filesize选项值',
- '002' => '超过了表单中MAX_FILE_SIZE设置的值',
- '003' => '文件部分被上传',
- '004' => '没有选择上传文件',
- '005' => '没有找到临时目录',
- '006' => '文件不可写',
- '007' => '由于PHP的扩展程序中断文件上传',
- '008' => '上传文件过大',
- '009' => '不允许的文件类型',
- '010' => '不允许的文件MIME类型',
- '011' => '文件不是真实图片',
- '012' => '文件不是通过HTTP POST方式上传上来的',
- '013' => '文件移动失败',
- '014' => '系统错误:文件上传出错',
- );
- /**
- * Upload2 constructor.
- * @param string $fileName
- * @param string $uploadPath
- * @param bool $imgFlag
- * @param int $maxSize
- * @param array $allowExt
- * @param array $allowMime
- */
- public function __construct($fileName='myFile',$uploadPath='./uploads',$imgFlag=true,$maxSize=5242880,
- $allowExt=array('jpeg','jpg','png','gif'),
- $allowMime=array('image/jpeg','image/png','image/gif')) {
- $this->fileName = $fileName;
- $this->maxSize = $maxSize;
- $this->allowMime = $allowMime;
- $this->allowExt = $allowExt;
- $this->uploadPath = $uploadPath;
- $this->imgFlag = $imgFlag;
- $this->fileInfos = $this->getFileInfos();
- }
- /**
- * 获取上传的文件信息,并判断上传的文件是单文件还是多文件,设置上传文件的模式
- * @return mixed
- */
- protected function getFileInfos() {
- if(isset($_FILES[$this->fileName])) {
- $file = $_FILES[$this->fileName];
- } else {
- $this->error = '014';
- $this->showError();
- }
- $i = 0;
- //单文件或者多个单文件上传
- if(is_string($file['name'])) {
- $files[$i] = $file;
- } //多文件上传
- elseif(is_array($file['name'])) {
- foreach($file['name'] as $key=>$val) {
- $files[$i]['name'] = $file['name'][$key];
- $files[$i]['type'] = $file['type'][$key];
- $files[$i]['tmp_name'] = $file['tmp_name'][$key];
- $files[$i]['error'] = $file['error'][$key];
- $files[$i]['size'] = $file['size'][$key];
- $i++;
- }
- }
- return $files;
- }
- /**
- * 显示错误
- */
- protected function showError() {
- $e = $this->err[$this->error];
- exit('<span style="color:red">' . $e . '</span>');
- }
- /**
- * 为序号为$cur的文件设置上传结果信息
- * @param $cur
- * @param string $errno
- */
- protected function setError($cur, $errno='000') {
- $this->uploadRes[$cur]['errno'] = $errno;
- $this->uploadRes[$cur]['error'] = $this->err[$errno];
- $this->uploadRes[$cur]['dest'] = '';
- }
- /**
- * 检测上传文件是否出错
- * @param int $cur
- * @return bool
- */
- protected function checkError($cur=0) {
- if(is_null($this->fileInfos[$cur])) { //文件获取失败
- $this->error = '014';
- $this->showError();
- return false;
- }
- if($this->fileInfos[$cur]['error']>0) {
- switch($this->fileInfos[$cur]['error']) {
- case 1:
- $curErr = '001';
- break;
- case 2:
- $curErr = '002';
- break;
- case 3:
- $curErr = '003';
- break;
- case 4:
- $curErr = '004';
- break;
- case 6:
- $curErr = '005';
- break;
- case 7:
- $curErr = '006';
- break;
- case 8:
- $curErr = '007';
- break;
- }
- $this->setError($cur, $curErr);
- return false;
- }
- return true;
- }
- /**
- * 检测上传文件的大小
- * @param int $cur
- * @return bool
- */
- protected function checkSize($cur=0) {
- if($this->fileInfos[$cur]['size'] > $this->maxSize) {
- $this->setError($cur, '008');
- return false;
- }
- return true;
- }
- /**
- * 获取序号为$cur文件的扩展名
- * @param int $cur
- * @return string
- */
- protected function getCurExt($cur=0) {
- return strtolower(pathinfo($this->fileInfos[$cur]['name'], PATHINFO_EXTENSION));
- }
- /**
- * 检测文件扩展名
- * @param int $cur
- * @return bool
- */
- protected function checkExt($cur=0) {
- $ext = $this->getCurExt($cur);
- if(!in_array($ext, $this->allowExt)) {
- $this->setError($cur, '009');
- return false;
- }
- return true;
- }
- /**
- * 检测文件的MIME类型
- * @param int $cur
- * @return bool
- */
- protected function checkMime($cur=0) {
- if(!in_array($this->fileInfos[$cur]['type'],$this->allowMime)) {
- $this->setError($cur, '010');
- return false;
- }
- return true;
- }
- /**
- * 检测文件是否为真实图片
- * @param int $cur
- * @return bool
- */
- protected function checkTrueImg($cur=0) {
- if($this->imgFlag) {
- if([email protected]getimagesize($this->fileInfos[$cur]['tmp_name'])) {
- $this->setError($cur, '011');
- return false;
- }
- }
- return true;
- }
- /**
- * 检测是否通过HTTP Post方式上传过来的
- * @param int $cur
- * @return bool
- */
- protected function checkHTTPPost($cur=0) {
- if(!is_uploaded_file($this->fileInfos[$cur]['tmp_name'])) {
- $this->error = '012';
- return false;
- }
- return true;
- }
- /**
- * 检测目录是否存在,如果不存在则进行创建
- */
- protected function checkUploadPath() {
- if(!file_exists($this->uploadPath)) {
- mkdir($this->uploadPath, 0777, true);
- }
- }
- /**
- * 产生唯一字符串
- * @return string
- */
- protected function getUniName() {
- return md5(uniqid(microtime(true),true));
- }
- /**
- * 上传文件
- * @return string
- */
- public function uploadFile() {
- foreach ($this->fileInfos as $key => $value) {
- if($this->checkError($key) && $this->checkSize($key)
- && $this->checkExt($key) && $this->checkMime($key)
- && $this->checkTrueImg($key) && $this->checkHTTPPost($key)) {
- $this->checkUploadPath();
- $uniName = $this->getUniName();
- $ext = $this->getCurExt($key);
- $destination = $this->uploadPath . '/' . $uniName . '.' . $ext;
- if(@move_uploaded_file($this->fileInfos[$key]['tmp_name'], $destination)) {
- $this->setError($key);
- $this->uploadRes[$key]['dest'] = $destination;
- } else {
- $this->setError($key, '013');
- }
- }
- }
- return $this->uploadRes;
- }
- }
doAction.php
- <?php
- /**
- * Created by PhpStorm.
- * User: DreamBoy
- * Date: 2016/4/9
- * Time: 10:31
- */
- header('content-type:text/html;charset=utf-8');
- require_once 'Upload2.class.php';
- function dump($arr) {
- echo '<pre>';
- print_r($arr);
- echo '</pre>';
- }
- //$upload = new Upload();
- //$upload = new Upload('myFile2');
- $upload = new Upload2('myFile');
- $res = $upload->uploadFile();
- dump($res);
运行:
选择文件:
跳转结果:
跳转后显示的结果信息提示,与我们提交的文件应提示的信息一致。
从中我们也可以看到只有两个文件上传成功。如下:
修改-》 在Upload2.class.php类中增加 一些返回信息:如文件名称,文件类型。提供是否保留文件原名的设置。
- <?php
- /**
- * Created by PhpStorm.
- * User: DreamBoy
- * Date: 2016/4/9
- * Time: 9:24
- */
- error_reporting(0);
- class Upload {
- protected $fileName; //POST请求时文件的name值
- protected $maxSize; //文件上传的最大大小
- protected $allowMime; //允许上传的文件类型
- protected $allowExt; //允许上传的文件类型
- protected $uploadPath; //文件上传的路径
- protected $imgFlag; //标志是否要求上传的文件为真实图片
- protected $isOldName; //标志是否要求上传的文件保留原名
- protected $fileInfos; //所有文件信息
- protected $uploadRes; //上传文件的结果
- protected $error; //记录系统错误号
- protected $err = array( //错误号及错误类型
- '000' => '文件上传成功',
- '001' => '超过了PHP配置文件中upload_max_filesize选项值',
- '002' => '超过了表单中MAX_FILE_SIZE设置的值',
- '003' => '文件部分被上传',
- '004' => '没有选择上传文件',
- '005' => '没有找到临时目录',
- '006' => '文件不可写',
- '007' => '由于PHP的扩展程序中断文件上传',
- '008' => '上传文件过大',
- '009' => '不允许的文件类型',
- '010' => '不允许的文件MIME类型',
- '011' => '文件不是真实图片',
- '012' => '文件不是通过HTTP POST方式上传上来的',
- '013' => '文件移动失败',
- '014' => '系统错误:文件上传出错',
- );
- /**
- * Upload2 constructor.
- * @param string $fileName
- * @param string $uploadPath
- * @param bool $isOldName
- * @param bool $imgFlag
- * @param int $maxSize
- * @param array $allowExt
- * @param array $allowMime
- */
- public function __construct($fileName='myFile',$uploadPath='./uploads',$isOldName=false,$imgFlag=true,
- $maxSize=5242880,$allowExt=array('jpeg','jpg','png','gif'),
- $allowMime=array('image/jpeg','image/png','image/gif')) {
- $this->fileName = $fileName;
- $this->maxSize = $maxSize;
- $this->allowMime = $allowMime;
- $this->allowExt = $allowExt;
- $this->uploadPath = $uploadPath;
- $this->imgFlag = $imgFlag;
- $this->isOldName = $isOldName;
- $this->fileInfos = $this->getFileInfos();
- }
- /**
- * 获取上传的文件信息,并判断上传的文件是单文件还是多文件,设置上传文件的模式
- * @return mixed
- */
- protected function getFileInfos() {
- if(isset($_FILES[$this->fileName])) {
- $file = $_FILES[$this->fileName];
- } else {
- $this->error = '014';
- $this->showError();
- }
- $i = 0;
- //单文件或者多个单文件上传
- if(is_string($file['name'])) {
- $files[$i] = $file;
- } //多文件上传
- elseif(is_array($file['name'])) {
- foreach($file['name'] as $key=>$val) {
- $files[$i]['name'] = $file['name'][$key];
- $files[$i]['type'] = $file['type'][$key];
- $files[$i]['tmp_name'] = $file['tmp_name'][$key];
- $files[$i]['error'] = $file['error'][$key];
- $files[$i]['size'] = $file['size'][$key];
- $i++;
- }
- }
- return $files;
- }
- /**
- * 显示错误
- */
- protected function showError() {
- $e = $this->err[$this->error];
- exit('<span style="color:red">' . $e . '</span>');
- }
- /**
- * 为序号为$cur的文件设置上传结果信息
- * @param $cur
- * @param string $errno
- */
- protected function setError($cur, $errno='000') {
- $this->uploadRes[$cur]['errno'] = $errno;
- $this->uploadRes[$cur]['error'] = $this->err[$errno];
- $this->uploadRes[$cur]['name'] = '';
- $this->uploadRes[$cur]['dest'] = '';
- $this->uploadRes[$cur]['type'] = '';
- }
- /**
- * 检测上传文件是否出错
- * @param int $cur
- * @return bool
- */
- protected function checkError($cur=0) {
- if(is_null($this->fileInfos[$cur])) { //文件获取失败
- $this->error = '014';
- $this->showError();
- return false;
- }
- if($this->fileInfos[$cur]['error']>0) {
- switch($this->fileInfos[$cur]['error']) {
- case 1:
- $curErr = '001';
- break;
- case 2:
- $curErr = '002';
- break;
- case 3:
- $curErr = '003';
- break;
- case 4:
- $curErr = '004';
- break;
- case 6:
- $curErr = '005';
- break;
- case 7:
- $curErr = '006';
- break;
- case 8:
- $curErr = '007';
- break;
- }
- $this->setError($cur, $curErr);
- return false;
- }
- return true;
- }
- /**
- * 检测上传文件的大小
- * @param int $cur
- * @return bool
- */
- protected function checkSize($cur=0) {
- if($this->fileInfos[$cur]['size'] > $this->maxSize) {
- $this->setError($cur, '008');
- return false;
- }
- return true;
- }
- /**
- * 获取序号为$cur文件的扩展名
- * @param int $cur
- * @return string
- */
- protected function getCurExt($cur=0) {
- return strtolower(pathinfo($this->fileInfos[$cur]['name'], PATHINFO_EXTENSION));
- }
- /**
- * 检测文件扩展名
- * @param int $cur
- * @return bool
- */
- protected function checkExt($cur=0) {
- $ext = $this->getCurExt($cur);
- if(!in_array($ext, $this->allowExt)) {
- $this->setError($cur, '009');
- return false;
- }
- return true;
- }
- /**
- * 检测文件的MIME类型
- * @param int $cur
- * @return bool
- */
- protected function checkMime($cur=0) {
- if(!in_array($this->fileInfos[$cur]['type'],$this->allowMime)) {
- $this->setError($cur, '010');
- return false;
- }
- return true;
- }
- /**
- * 检测文件是否为真实图片
- * @param int $cur
- * @return bool
- */
- protected function checkTrueImg($cur=0) {
- if($this->imgFlag) {
- if([email protected]getimagesize($this->fileInfos[$cur]['tmp_name'])) {
- $this->setError($cur, '011');
- return false;
- }
- }
- return true;
- }
- /**
- * 检测是否通过HTTP Post方式上传过来的
- * @param int $cur
- * @return bool
- */
- protected function checkHTTPPost($cur=0) {
- if(!is_uploaded_file($this->fileInfos[$cur]['tmp_name'])) {
- $this->error = '012';
- return false;
- }
- return true;
- }
- /**
- * 检测目录是否存在,如果不存在则进行创建
- */
- protected function checkUploadPath() {
- if(!file_exists($this->uploadPath)) {
- mkdir($this->uploadPath, 0777, true);
- }
- }
- /**
- * 产生唯一字符串
- * @return string
- */
- protected function getUniName() {
- return md5(uniqid(microtime(true),true));
- }
- /**
- * 上传文件
- * @return string
- */
- public function uploadFile() {
- foreach ($this->fileInfos as $key => $value) {
- if($this->checkError($key) && $this->checkSize($key)
- && $this->checkExt($key) && $this->checkMime($key)
- && $this->checkTrueImg($key) && $this->checkHTTPPost($key)) {
- $this->checkUploadPath();
- if($this->isOldName) {
- $name = $this->fileInfos[$key]['name'];
- $destination = $this->uploadPath . '/' . $name;
- } else {
- $name = $this->getUniName();
- $ext = $this->getCurExt($key);
- $destination = $this->uploadPath . '/' . $name . '.' . $ext;
- }
- if(@move_uploaded_file($this->fileInfos[$key]['tmp_name'], $destination)) {
- $this->setError($key);
- $this->uploadRes[$key]['name'] = $name;
- $this->uploadRes[$key]['dest'] = $destination;
- $this->uploadRes[$key]['type'] = $this->fileInfos[$key]['type'];
- } else {
- $this->setError($key, '013');
- }
- }
- }
- return $this->uploadRes;
- }
- }
相关推荐
- 安卓项目SVN必须上传的文件
- 开发者说:如何使用插件降低上传文件部署服务的复杂度
- eweb使用WINDOWS的“备份”工具对网站内容自动备份editor for php任意文件上传漏洞...
- 0509 8-2 不安全的文件上传原理及客户端绕过案例
- swagger2如何测试单个文件或者多文件上传(springboot)
- iOS 文件上传文件共享功能的实现
- 文件(图片)的上传和显示操作步骤
- 使Discuz支持大文件上传的插件
- PHP大文件上传(切片上传)
- Struts2高版本上传文件大小超出限制无法跳转到设置的input视图
- 【案例】京东APP筛选页和携程APP筛选页的异同是什么?为什么?
- Linux-centos7-LVM文件系统管理与开启系统磁盘配额的操作详解(有图有真相)