PHP三种方法实现多文件上传
今天一个网介绍三种多文件上传的方法,前两种都是直接遍历三维超全局数组$_FILES,最后一种是先定义一个单文件上传函数,再循环调用该函数,完成多文件的上传。
方法一:当多文件上传表单中多个上传文件的name属性为“pic[]”形式时,也即表单为这种形式。
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> PHP代码: <?php //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循环的括号
方法二:当多文件上传表单中多个上传文件的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> //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循环的括号
方法三:先定义单个文件上传的函数,再循环调用这个函数,每次传入一个文件的上传信息,也可以到达多文件上传的目的,而且这种方式,更容易理解。
<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 上传失败,返回失败的原因 * http://yige.org/php/ * 成功返回包括文件名的路径。 */ 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); //输出返回信息; }