PHP实现多文件上传,
PHP实现多文件上传,与单文件上传绝大部分是相同的,不过还是有区分的地方,主要有三点:
一、前端页面:
可以出现多个文件浏览按钮,也可以设置文件浏览按钮可以选择多个文件。需要注意的是文件浏览按钮的名字是数组,因为要求上传多个文件。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2>上传文件</h2>
<form action="testFiles.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[]" multiple="multiple"/><br/>
<input type='submit' value="上传文件"/>
</form>
</body>
</html>
二、如果上传的是多个文件,通过$_FILES获得的数组是三维数组;如果上传的是单个文件,通过$_FILES获得的数组是二维数组,所以这都需要判断,并且为了使用通过检测的图片文件成功上传,需要重构上传文件的信息。
其中getFiles()为上传文件信息的重构函数封装;uploadFile()为上传文件的检测函数封装,具体代码如下:
<span ><?php
//构造上传文件信息
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=>$var){
$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 uploadFile($pic_info){
//判断是否上传头像
if(!empty($pic_info)){
//判断文件上传到临时文件是否出错
if($pic_info['error'] >0){
$error_msg = '上传错误:';
switch($pic_info['error']){
case 1: $error_msg .= '文件大小超过了php.ini中upload_max_filesize选项限制的值!'; break;
case 2: $error_msg .= '文件大小超过了表单中max_file_size选项指定的值!'; break;
case 3: $error_msg .= '文件只有部分被上传!'; break;
case 4: $error_msg .= '没有文件被上传!'; break;
case 6: $error_msg .= '找不到临时文件夹!'; break;
case 7: $error_msg .= '文件写入失败!'; break;
case 8: $error_msg .= '由于PHP的扩展程序中断文件上传!'; break;
default: $error_msg .='未知错误!'; break;
}
echo $error_msg;
return false;
}
//获取上传文件的类型,两种方法
//$type = substr(strrchr($pic_info['name'],'.'),1);
$type = pathinfo($pic_info['name'],PATHINFO_EXTENSION);
$allow = array('jpeg','jpg','png','gif');
//判断上传文件类型
if(!in_array($type,$allow)){
echo '图像类型不符合要求<br/>';
return false;
}
//检测上传文件大小是否符合大小
$maxSize = 2097152; //2M
if($pic_info['size']>$maxSize){
exit('上传文件过大<br/>');
}
//检测文件是否是通过HTTP POST方式上传的
if(!is_uploaded_file($pic_info['tmp_name'])){
exit('文件还是通过HTTP POST方式上传的。<br/>');
}
//检测上传文件是否为真实的图片类型
if(!getimagesize($pic_info['tmp_name'])){
exit('不是一个真实的图片类型。<br/>');
}
//为上传文件起唯一的名字,确保不被覆盖
//$new_file = $pic_info['id'].'.jpg';
$unique = md5(uniqid(microtime(true),true)).'.'.$type;
//如果指定目录不存在,则创建目录
$uploadPath = 'upload';
if(!file_exists($uploadPath)){
mkdir($uploadPath,0777,true);
chmod($uploadPath,0777);
}
$destination = $uploadPath.'/'.$unique;
//从暂存目录上传到指定目录,@屏蔽错误信息
if(!@move_uploaded_file($pic_info['tmp_name'],$destination)){
exit('文件上传失败<br/>');
}
echo '文件上传成功<br/>';
return $destination;
}else{
echo "请选择上传图片!<br/>";
}
}
?></span>三、通过PHP代码实现多个文件的上传功能
<span ><?php
//print_r($_FILES);
header('Content-type:text/html;charset=utf-8');
include_once 'multiUpload.php';
$files = getFiles();
print_r($files);
foreach($files as $fileInfo){
$file[] = uploadFile($fileInfo);
}
//array_values()返回数组中所有的值并给其建立数字索引。
//array_filter()对数组进行过滤,去掉空值
$uploadFile = array_values(array_filter($file));
print_r($uploadFile);
?></span>可以在页面上得到如下信息,可以看到上传成功文件的名称:
Array(
[0] => Array(
[name] => IMG_20130930_120224.jpg
[type] => image/jpeg
[tmp_name] => D:\xampp\tmp\php4DEE.tmp
[error] => 0
[size] => 365134)
[1] => Array(
[name] => IMG_20130930_120314.jpg
[type] => image/jpeg
[tmp_name] => D:\xampp\tmp\php4DFE.tmp
[error] => 0
[size] => 383420)
[2] => Array(
[name] => IMG_20130930_120436.jpg
[type] => image/jpeg
[tmp_name] => D:\xampp\tmp\php4E3E.tmp
[error] => 0
[size] => 436443)
[3] => Array(
[name] => IMG_20130930_124607.jpg
[type] => image/jpeg
[tmp_name] => D:\xampp\tmp\php4E3F.tmp
[error] => 0
[size] => 468199)
)
文件上传成功
文件上传成功
文件上传成功
文件上传成功
Array(
[0] => upload/4217e6f9a0251b2d8a59dec66cbe9810.jpg
[1] => upload/027b42fbff0117620e670b5710f8d45b.jpg
[2] => upload/d88ef934b7b6ebbc68c2e3afb79f05c2.jpg
[3] => upload/4048607fa33c73adb3473b21caa27aca.jpg)