- upload.html
- //要在选择上传文件时能一次选择多个文件,那么就加multiple="multiple" ,还有注意下name="myFile1"和name="myFile[]"的区别,单文件、多文件上传.
- <!doctype html>
- <html>
- <head>
- <meta charset="utf-8">
- <title>无标题文档</title>
- </head>
- <body>
- <form action="upload.php" method="post" enctype="multipart/form-data">
- <input type="file" name="myFile1" /><br/>
- <input type="file" name="myFile2" /><br/>
- <input type="file" name="myFile[]" /><br/>
- <input type="file" name="myFile[]" /><br/>
- <input type="file" name="myFile[]" multiple="multiple"/><br/>
- <input type="submit" value="上传文件"/>
- </form>
- </body>
- </html>
- 文件上传处理 upload.php
- <?php
- /**
- * Created by PhpStorm.
- * User: DreamBoy
- * Date: 2016/4/8
- * Time: 21:39
- */
- header('content-type:text/html;charset=utf-8');
- include_once 'upload.function.php';
- $files = getFiles();
- //print_r($files);
- foreach($files as $fileInfo) {
- $res = uploadFile($fileInfo);
- echo $res['mes'],'<br/>';
- if(isset($res['dest'])) {
- $uploadFiles[] = $res['dest'];
- }
- }
- //过滤掉上传失败的文件
- /**
- * array_values() 函数返回一个包含给定数组中所有键值的数组,但不保留键名。
- * 提示:被返回的数组将使用数值键,从 0 开始并以 1 递增。
- */
- /**
- * array_filter() 函数用回调函数过滤数组中的值。
- * 该函数把输入数组中的每个键值传给回调函数。如果回调函数返回 true,
- * 则把输入数组中的当前键值返回结果数组中。数组键名保持不变。
- */
- //这里使用array_filter过滤掉数组中的空内容
- if(isset($uploadFiles)) {
- $uploadFiles=array_filter($uploadFiles);
- print_r($uploadFiles);
- }
- 实现文件上传的函数 upload.function.php
- <?php
- /**
- * Created by PhpStorm.
- * User: DreamBoy
- * Date: 2016/4/8
- * Time: 21:41
- */
- /**
- * 构建上传文件信息
- * @return mixed
- */
- function getFiles() {
- $i = 0;
- foreach($_FILES as $file) {
- //单文件或者多个单文件上传
- if(is_string($file['name'])) {
- $files[$i] = $file;
- $i++;
- } //多文件上传
- 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;
- }
- /**
- * 获取文件扩展名
- */
- function getExt($filename) {
- return strtolower(pathinfo($filename,PATHINFO_EXTENSION));
- }
- /**
- * 获取唯一字符串
- */
- function getUniName() {
- return md5(uniqid(microtime(true), true));
- }
- /**
- * 针对于单文件、多个单文件、多文件的上传
- * @param array $fileInfo
- * @param string $path
- * @param bool $flag
- * @param int $maxSize
- * @param array $allowExt
- * @return array
- */
- function uploadFile($fileInfo, $path='./uploads',$flag=true,$maxSize=1048576,$allowExt = array('jpeg','jpg','gif','png')) {
- //$allowExt = array('jpeg','jpg','gif','png');
- //$flag = true;
- //$maxSize = 1048576; //1M
- $res = array();
- //判断错误号
- if($fileInfo['error'] == UPLOAD_ERR_OK) {
- //检测上传文件的大小
- if($fileInfo['size'] > $maxSize) {
- $res['mes'] = $fileInfo['name'] . '上传文件过大';
- }
- $ext = getExt($fileInfo['name']);
- //检测上传文件的文件类型
- if(!in_array($ext, $allowExt)) {
- $res['mes'] = $fileInfo['name'] . '非法文件类型';
- }
- //检测是否是真是的图片类型
- if($flag) {
- if(!getimagesize($fileInfo['tmp_name'])) {
- $res['mes'] = $fileInfo['name'] . '不是真实图片类型';
- }
- }
- //检测文件是否是通过HTTP POST上传上来的
- if(!is_uploaded_file($fileInfo['tmp_name'])) {
- $res['mes'] = $fileInfo['name'] . '文件不是通过HTTP POST方式上传上来的';
- }
- if($res) return $res;
- //$path = './uploads';
- if(!file_exists($path)) {
- mkdir($path, 0777, true);
- chmod($path, 0777);
- }
- $uniName = getUniName();
- $destination = $path . '/' . $uniName . '.' . $ext;
- if(!move_uploaded_file($fileInfo['tmp_name'],$destination)) {
- $res['mes'] = $fileInfo['name'] . '文件移动失败';
- }
- $res['mes'] = $fileInfo['name'] . '上传成功';
- $res['dest'] = $destination;
- return $res;
- } else {
- //匹配错误信息
- switch($fileInfo['error']) {
- case 1:
- $res['mes'] = '上传文件超过了PHP配置文件中upload_max_filesize选项的值';
- break;
- case 2:
- $res['mes'] = '超过了表单MAX_FILE_SIZE限制的大小';
- break;
- case 3:
- $res['mes'] = '文件部分被上传';
- break;
- case 4:
- $res['mes'] = '没有选择上传文件';
- break;
- case 6:
- $res['mes'] = '没有找到临时目录';
- break;
- case 7:
- $res['mes'] = '文件写入失败';
- break;
- case 8:
- $res['mes'] = '系统错误';
- break;
- }
- return $res;
- }
- }