在胡說以前,首先聲明,本文是創建在掌握php單文件上傳的基礎上,因此這裏就不贅述文件上傳服務器配置,表單設置該注意的地方了。php
話很少少,直入主題,在請求頁面方面有兩種寫法(只呈現表單部分,以上傳三個文件爲例。)數組
<form action="doAction.php" method="post" enctype="multipart/form-data"> 請選擇個人上傳文件 <input type="file" name="myfile[]"/> <input type="file" name="myfile[]" /> <input type="file" name="myfile[]" /> <input type="submit" value="上傳" /> </form>
<form action="doAction.php" method="post" enctype="multipart/form-data"> 請選擇個人上傳文件 <input type="file" name="myfil1"/> <input type="file" name="myfil2"/> <input type="file" name="myfil3"/> <input type="submit" value="上傳" /> </form>
兩個對比,發現僅僅是name的不一樣,第一個將name設置成數組的形式,而第二個則是咱們一般設置也很容易想到的一種方法。服務器
雖然表面上顯示的僅僅有一點點不一樣,但真正提交到doAction.php頁面的$_FILES則有很大不一樣。函數
第一種的$_FILES是一個三維數組,而第二種是二維數組,以下:post
顯然咱們處理第二種格式的$_FILES更加方便。固然咱們也能夠想辦法將第一種格式的$_FILES轉化爲第二種形式,以下:\spa
function getFiles(){ foreach($_FILES as $file){ $fileNum=count($file['name']); if ($fileNum==1) { $files=$file; }else{ for ($i=0; $i < $fileNum; $i++) { $files[$i]['name']=$file['name'][$i]; $files[$i]['type']=$file['type'][$i]; $files[$i]['tmp_name']=$file['tmp_name'][$i]; $files[$i]['error']=$file['error'][$i]; $files[$i]['size']=$file['size'][$i]; } } } return $files; }
經過這個函數,將$_FILES轉化爲下面格式:3d
此刻,兩種上傳方式已經處在同一塊兒跑線了,下面的工做即是編寫uploadFile()函數對每一個文件進行上傳,這也是本文的重點。code
文件上傳函數:orm
function uploadFile($file,$path='./uploads',$max_size,$allowExt){ $filename=$file['name']; $type=$file['type']; $temp_name=$file['tmp_name']; $error=$file['error']; $size=$file['size']; if ($error==UPLOAD_ERR_OK) { if ($size>$max_size) { $res['mes']=$filename."文件超過規定上傳大小"; } $ext=getExt($filename); if (!in_array($ext, $allowExt)) { $res['mes']=$filename.'文件名不合乎規範'; } if (!is_uploaded_file($temp_name)) { $res['mes']=$filename."文件不是經過HTTP POST 方法上傳上傳過來的"; } if (@$res) { return $res; } if (!file_exists($path)) { mkdir($path,0777,true); chmod($path, 0777); } $fname=getUniName(); $destination=$path.'/'.$fname.'.'.$ext; if (move_uploaded_file($temp_name, $destination)) { $res['mes']=$filename.'上傳成功'; $res['dest']=$destination; }else{ $res['mes']=$filename."文件上傳失敗"; } }else{ switch ($error) { case '1': $res['mes']="超過了配置文件上傳文件的大小"; break; case '2': $res['mes']="超過表單設置上傳文件文件的大小"; break; case '3': $res['mes']="文件部分被上傳"; break; case '4': $res['mes']="沒有文件被上傳"; break; case '6': $res['mes']="沒有找到臨時目錄"; break; case '7': $res['mes']="文件不可寫"; break; default: $res['mes']="上傳文件失敗"; break; } } return $res; }
其中還涉及了兩個小函數:blog
/** * 得到文件擴展名 * @param string $filename 上傳文件名 * @return string 返回擴展名 */ function getExt($filename){ $arr=explode('.', basename($filename)); return end($arr); } /** * 得到文件惟一擴展名 * @return string 通過md5後生成32位惟一的上傳文件名 */ function getUniName(){ return md5(uniqid(microtime(true),true)); }
感覺:
好久前接觸過php文件上傳,當時感受一團亂麻。如今看來只要掌握$_FILES裏面包含什麼信息,利用本身寫過的知識處理一些小技巧,系統有邏輯的加以考慮,適時地封裝函數,之後文件上傳就能夠很快地展開。此次我展示的代碼必然不是能知足任何須要,因此能夠適當改造,成爲本身的代碼。好比若是要求上傳文件是圖片內容的話,單靠擴展名是絕對不能判斷的,還須要利用圖片的特性加以驗證。