PHP多文件上传的方法

这里介绍三种 PHP多文件上传的方法 ,前两种都是直接遍历三维超全局数组$_FILES,最后一种是先定义一个单文件上传函数,再循环调用该函数,完成多文件的上传。

也即表单为这种形式: 
<!--lang:html-->
<form action="" method="post" enctype="multipart/form-data"> 
<input type="hidden" name="MAX_FILE_SIZE"    value=""> 
<input type="file" name="pic[]" /><br><br> 
<input type="file" name="pic[]" /><br><br> 
<input type="file" name="pic[]" /><br><br> 
<input type="file" name="pic[]" /><br><br> 
<input type="submit" value="upload"/> 
</form> 
可用foreach 循环 上传多个文件: 
//1.获取要上传文件的信息 
$up_info=$_FILES['pic']; 
$ob_path="../system";   
$typelist=array("image/gif","image/jpeg","image/pjpeg","image/png"); //定义运行的上传文件类型 
for($i=0;$i<count($up_info['name']);$i++){        //foreach 循环处理多个文件上传 
//2.判断文件是否上传错误 
if($up_info['error'][$i]>0){ 
switch($up_info['error'][$i]){ 
case 1: 
$err_info="上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值"; 
break; 
case 2: 
$err_info="上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值"; 
break; 
case 3: 
$err_info="文件只有部分被上传"; 
break; 
case 4: 
$err_info="没有文件被上传"; 
break; 
case 6: 
$err_info="找不到临时文件夹"; 
break; 
case 7: 
$err_info="文件写入失败"; 
break; 
default: 
$err_info="未知的上传错误"; 
break; 
} 
continue($err_info); 
} 
//3.判断文件上传的类型是否合法 
if(!in_array($up_info['type'][$i],$typelist)){ 
continue('文件类型错误!'.$up_info['type'][$i]); 
} 
//4.上传文件的大小过滤 
if($up_info['size'][$i]>1000000){ 
continue('文件大小超过1000000'); 
} 
//5.上传文件名处理 
$exten_name=pathinfo($up_info['name'][$i],PATHINFO_EXTENSION); 
do{ 
$main_name=date('YmHis'.'--'.rand(100,999));         
$new_name=$main_name.'.'.$exten_name; 
}while(file_exists($to_path.'/'.$new_name)); 
//6.判断是否是上传的文件,并执行上传 
if(is_uploaded_file($up_info['tmp_name'][$i])){ 
if(move_uploaded_file($up_info['tmp_name'][$i],$ob_path.'/'.$new_name)){ 
echo '文件上传成功!'; 
}else{ 
echo '上传文件移动失败!'; 
} 
}else{ 
echo '文件不是上传的文件'; 
} 
}   //for循环的括号 
2.当多文件上传表单中多个上传文件的name属性为“pic,text,doc,pdf”形式时, 
也即表单为这种形式: 
<form action="" method="post" enctype="multipart/form-data"> 
<input type="hidden" name="MAX_FILE_SIZE"    value=""> 
<input type="file" name="pic" /><br><br> 
<input type="file" name="text" /><br><br> 
<input type="file" name="doc" /><br><br> 
<input type="file" name="pdf" /><br><br> 
<input type="submit" value="upload"/> 
</form> 
也可用foreach 循环 上传多个文件: 
//1.获取要上传文件的信息 
$up_info=$_FILES; 
$ob_path="..\system";   
$typelist=array("image/gif","image/jpeg","image/pjpeg","image/png"); //定义运行的上传文件类型 
foreach($up_info as $k_name=>$value){   //用foreach循环 处理多个文件的上传 
//2.判断文件是否上传错误 
if($up_info[$k_name]['error']>0){ 
switch($up_info['error'][$i]){ 
case 1: 
$err_info="上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值"; 
break; 
case 2: 
$err_info="上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值"; 
break; 
case 3: 
$err_info="文件只有部分被上传"; 
break; 
case 4: 
$err_info="没有文件被上传"; 
break; 
case 6: 
$err_info="找不到临时文件夹"; 
break; 
case 7: 
$err_info="文件写入失败"; 
break; 
default: 
$err_info="未知的上传错误"; 
break; 
} 
continue($err_info); 
} 
//3.判断文件上传的类型是否合法 
if(!in_array($up_info[$k_name]['type'],$typelist)){ 
continue('文件类型错误!'.$up_info[$k_name]['type']); 
} 
//4.上传文件的大小过滤 
if($up_info[$k_name]['size']>100000){ 
echo '文件大小超过**'; 
continue; 
} 
//5.上传文件名处理 
$exten_name=pathinfo($up_info[$k_name]['name'],PATHINFO_EXTENSION); 
do{ 
$main_name=date('YmHis'.'--'.rand(100,999));         
$new_name=$main_name.'.'.$exten_name; 
}while(file_exists($to_path.'/'.$new_name)); 
//6.判断是否是上传的文件,并执行上传 
if(is_uploaded_file($up_info[$k_name]['tmp_name'])){ 
if(move_uploaded_file($up_info[$k_name]['tmp_name'],$ob_path.'/'.$new_name)){ 
echo '文件上传成功!'; 
}else{ 
echo '上传文件移动失败!'; 
} 
}else{ 
echo '文件不是上传的文件'; 
} 
}   //for循环的括号 
//3.上面的循环是嵌入到文件上传的代码中的,可能有点不好理解,这儿提供第三种法, 
//先定义单个文件上传的函数,再循环调用这个函数,每次传入一个文件的上传信息, 
//也可以到达多文件上传的目的,而且这种方式,更容易理解。 
//上传的表单的形式和第二种方法中的相同,即: 
<form action="" method="post" enctype="multipart/form-data"> 
<input type="hidden" name="MAX_FILE_SIZE" value=""> 
<input type="file" name="pic1" ><br>             
<input type="file" name="pic2"><br> 
<input type="file" name="pic3"><br> 
<input type="submit" value="upload"> 
</form> 
//定义函数如下: 
/* 
*单文件上传函数 
*@param array $up_info   记录上传文件信息的超全局数组 
*@param string $to_path  上传文件的目标路径 
*@param array $typlist   允许的文件类型 
*@param int    $file_size允许的文件大小 
*@return string 上传失败,返回失败的原因, 
* 
*                成功返回包括文件名的路径。 
*/
function upload_fun($up_info,$to_path,$typelist=array(),$file_size=2000000){ 
//1.判断文件上传是否错误 
if($up_file['error']>0){ 
switch($up_info['error']){ 
case 1: 
$err_info="上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值"; 
break; 
case 2: 
$err_info="上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值"; 
break; 
case 3: 
$err_info="文件只有部分被上传"; 
break; 
case 4: 
$err_info="没有文件被上传"; 
break; 
case 6: 
$err_info="找不到临时文件夹"; 
break; 
case 7: 
$err_info="文件写入失败"; 
break; 
default: 
$err_info="未知的上传错误"; 
break; 
} 
return $err_info; 
die(); 
} 
//2.判断上传文件类型是否合法 
if(count($typelist)>0){ 
if(!in_array($up_info['type'],$typelist)){ 
$err_info='文件类型不合法!'.$up_info['type']; 
return $err_info; 
die(); 
} 
} 
//4.判断上传文件大小是否超出允许值 
if($up_info['size']>$file_size){ 
return $err_info='文件大小超过'.$file_size; 
die(); 
} 
//5.上传文件重命名 
$exten_name=pathinfo($up_info['name'],PATHINFO_EXTENSION); 
do{ 
$main_name=date('YmHis'.'--'.rand(100,999));         
$new_name=$main_name.'.'.$exten_name; 
}while(file_exists($to_path.'/'.$new_name)); 
//6.判断是否是上传的文件,并移动文件 
if(is_uploaded_file($up_info['tmp_name'])){ 
if(move_uploaded_file($up_info['tmp_name'],$to_path.'/'.$new_name)){ 
$err_info=$to_path.'/'.$new_name; 
return     $err_info;             
die(); 
}else{ 
return $err_info='上传文件移动失败!'; 
die(); 
} 
}else{ 
return $err_info='这个文件不是上传文件!'; 
die(); 
} 
} 
//函数使用方法如下 
$multi_info=$_FILES;  //接收$_FILES的全部上传信息 
$to_path='system';      //上传文件的目标路径     
foreach($multi_info as $name=>$up_info){      //foreach 遍历$multi_info  
$err_info=upload_fun($up_info,$to_path);  //调用单文件上传函数 
p($err_info);                              //输出返回信息; 
}
赞 (0)

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址