PHP 多文件上傳的三種方法

jopen 12年前發布 | 3K 次閱讀 Apache Cayenne Arx Libertatis

<?php
這里介紹三種多文件上傳的方法,前兩種都是直接遍歷
三維超全局數組$_FILES,最后一種是先定義一個單文件
上傳函數,再循環調用該函數,完成多文件的上傳。
1.當多文件上傳表單中多個上傳文件的name屬性為“pic[]”形式時,
也即表單為這種形式:

<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); //輸出返回信息;

}

//本文到此結束,歡迎指正,謝謝閱覽。

?></pre>原文地址:http://bbs.lampbrother.net/read-htm-tid-118983.html

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!