您好,欢迎访问一九零五行业门户网

如何实现php多文件上传

其实多文件上传和单文件上传大同小异,原理都是一样的,首先还是index.html上传表单,只是把之前上传文件表单里的file更改成了file[]
<!doctype html public "-//w3c//dtd xhtml 1.0 transitional//en" "http://www.w3.org/tr/xhtml1/dtd/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="content-type" content="text/html;charset=utf-8"> <title>upload files</title> </head> <body> <form action="upload.php" enctype="multipart/form-data" method="post"> <input type="hidden" name="max_file_size" value="100000" /> 上传文件:<input type="file" name="file[]"/><br/> 上传文件:<input type="file" name="file[]"/><br/> 上传文件:<input type="file" name="file[]"/><br/> <input type="submit" value="上传" /> </form> </body> </html>
在upload.php用$_files打印看看
<?php print_r($_files); ?>
得出下面多维数组
array ( [file] => array ( [name] => array ( [0] => 照片1.jpg [1] => 照片2.jpg [2] => 照片3.jpg ) [type] => array ( [0] => image/jpeg [1] => image/jpeg [2] => image/jpeg ) [tmp_name] => array ( [0] => f:\wamp\tmp\php36c7.tmp [1] => f:\wamp\tmp\php36c8.tmp [2] => f:\wamp\tmp\php36c9.tmp ) [error] => array ( [0] => 0 [1] => 0 [2] => 0 ) [size] => array ( [0] => 0 [1] => 0 [2] => 0 ) ) )
按照单文件上传的原理,先想想我们需要得到什么?
很明显我们需要得到一个关于文件信息的数组,数组里包含name,type,tmp_name,error,size,而此时我们得到的是个多维数组,虽然对应的键值都存在,但它是多维的,
我们只需要把它拆分,比如上面的3个文件,我们只需要把它拆分成对应的3个文件信息数组就行了。
拆分数组的结构
array ( [0] => array ( [name] => 照片1.jpg [type] => image/jpeg [tmp_name] => f:\wamp\tmp\php13c1.tmp [error] => 0 [size] => 385150 ) [1] => array ( [name] => 照片2.jpg [type] => image/jpeg [tmp_name] => f:\wamp\tmp\php13d2.tmp [error] => 0 [size] => 242043 ) [2] => array ( [name] => 照片3.jpg [type] => image/jpeg [tmp_name] => f:\wamp\tmp\php13d3.tmp [error] => 0 [size] => 488293 ) )
下面是拆分重组数组代码
<?php //print_r($_files['file']); $arr=$_files['file']; $files=array(); for($i=0;$i<count($arr['name']);$i++){ $files[$i]['name']=$arr['name'][$i]; $files[$i]['type']=$arr['type'][$i]; $files[$i]['tmp_name']=$arr['tmp_name'][$i]; $files[$i]['error']=$arr['error'][$i]; $files[$i]['size']=$arr['size'][$i]; } print_r($files); ?>
剩下的东西就简单了,重复单文件上传的步骤,遍历处理一遍该数组就行了。
代码如下:
<?php //print_r($_files['file']); $arr=$_files['file']; $files=array(); for($i=0;$i<count($arr['name']);$i++){//count()统计数组键值name长度 $files[$i]['name']=$arr['name'][$i]; $files[$i]['type']=$arr['type'][$i]; $files[$i]['tmp_name']=$arr['tmp_name'][$i]; $files[$i]['error']=$arr['error'][$i]; $files[$i]['size']=$arr['size'][$i]; } for($i=0;$i<count($files);$i++){ //取得上传文件信息 $filename=$files[$i]['name']; $filetype=$files[$i]['type']; $fileerror=$files[$i]['type']; $filesize=$files[$i]['size']; $tempname=$files[$i]['tmp_name'];//临时文件名 //定义上传文件类型 $typelist = array("image/jpeg","image/jpg","image/png","image/gif"); //定义允许的类型 if($fileerror>0){ //上传文件错误编号判断 switch ($fileerror) { case 1: $message="上传的文件超过了php.ini 中 upload_max_filesize 选项限制的值。"; break; case 2: $message="上传文件的大小超过了 html 表单中 max_file_size 选项指定的值。"; break; case 3: $message="文件只有部分被上传。"; break; case 4: $message="没有文件被上传。"; break; case 6: $message="找不到临时文件夹。"; break; case 7: $message="文件写入失败"; break; case 8: $message="由于php的扩展程序中断了文件上传"; break; } exit("文件上传失败:".$message); } if(!is_uploaded_file($tempname)){ //判断是否是post上传过来的文件 exit("不是通过http post方式上传上来的"); }else{ if(!in_array($filetype, $typelist)){ exit("上传的文件不是指定类型"); }else{ if(!getimagesize($tempname)){ //避免用户上传恶意文件,如把病毒文件扩展名改为图片格式 exit("上传的文件不是图片"); } } if($filesize>1000000){ //对特定表单的上传文件限制大小 exit("上传文件超出限制大小"); }else{ //避免上传文件的中文名乱码 $filename=iconv("utf-8", "gbk", $filename);//把iconv抓取到的字符编码从utf-8转为gbk输出 $filename=str_replace(".", time().".", $filename);//在图片名称后加入时间戳,避免重名文件覆盖 if(move_uploaded_file($tempname, "uploads/".$filename)){ echo "上传文件成功!"; }else{ echo "上传文件失败"; } } } } ?>
以上就是如何实现php多文件上传的详细内容。
其它类似信息

推荐信息