關鍵函數:
is_uploaded_file():用於判斷指定的文件是否是通過 HTTP POST 上傳的,如果是則返回 TRUE。用於防止潛在的攻擊者對原本不能通過腳本交互的文件進行非法管理,這可以用來確保惡意的用戶無法欺騙腳本去訪問本不能訪問的文件。
move_uploaded_file():文件上傳后,首先會存儲在服務器的臨時目錄中,可以是該函數將上傳的文件移動到新位置。與 copy() 和 move() 相比,該函數還有一種額外的功能,檢查並確保由第一個參數 filename 指定的文件,是否是合法的上傳文件( 即通過 PHP 的 HTTP POST 上傳機制所上傳的 )。如果文件合法,則將其移動為由第二個參數 destination 指定的文件。如果 filename 不是合法的上傳文件,不會出現任何操作,將返回 FALSE。如果 filename 是合法的上傳文件,但出於某些原因無法移動,不會出現任何操作,也將返回FALSE。此外還將發出一條警告。若成功則返回TRUE。
其他函數:
array_pop():彈出並返回數組中的最后一個元素,並將 array 的長度減1。案例中用於取出文件后綴。
list():用數組中的元素為一組變量賦值。
多個文件上傳只需要在單個文件上傳的基礎上,在原來的二維數組 $_FILES 之外進行一次循環。
HTML:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>文件上傳</title> </head> <body> <form action="upload.php" method="post" enctype="multipart/form-data"> <input type="hidden" name="MAX_FILE_SIZE" value="1000000"> 選擇文件1:<input type="file" name="myfile[]"><br> 選擇文件2:<input type="file" name="myfile[]"><br> 選擇文件3:<input type="file" name="myfile[]"><br> <input type="submit" value="上傳文件"> </form> </body> </html>
圖1
圖2
uoload.php:
<?php $allowtype = array("gif","png","jpg"); //允許上傳的文件格式 $size = 1000000; //設置允許大小1M以內的文件 $path = "./uploads"; //設置上傳后保存文件的路徑 //判斷文件是否可以上傳到服務器 $_FILES['myfile'][error]為0表示成功 //循環 for( $i = 0;$i < count($_FILES['myfile']['error']);$i++ ){ $upfile[$i] = $_FILES['myfile']['name'][$i]; if($_FILES['myfile']['error'][$i]>0){ echo "上傳錯誤"; switch($_FILES['myfile']['error'][$i]){ case 1: die('第'.($i+1).'個文件上傳文件大小超出了PHP配置文件中的約定值:upload_max_filesize'); case 2: die('上傳第'.($i+1).'個文件大小超出了表單中的約定值:MAX_FILE_SIZE'); case 3: die('第'.($i+1).'個文件只被部分上傳'); case 4: die('第'.($i+1).'個文件沒有上傳'); default: die('未知錯誤'); } } //判斷上傳的文件是否為允許的文件類型,通過文件的后綴名 //array_pop 彈出並返回數組中的最后一個元素,並將array的長度減1 $hz[$i] = array_pop(explode(".",$_FILES['myfile']['name'][$i])); if(!in_array($hz[$i],$allowtype)){ die("第".($i+1)."個文件后綴是<b>{$hz}</b>,不是允許的文件類型!"); } /*也可通過獲取上傳文件的MIME類型中的主類型和子類型,來限制文件上傳的類型 list($maintype,$subtype) = explode("/",$_FILES['myfile']['type']); if($maintype == "text"){ die("不能上傳文本文件"); } */ //判斷上傳的文件是否允許大小 if($_FILES['myfile']['size'][$i]>$size){ die("第".($i+1)."個文件超過了允許的<b>{$size}</b>"); } //為了系統安全,同時也為了同名文件不被覆蓋,上傳后將文件名使用系統定義 $filename[$i] = date("YmdHis").rand(100,999).".".$hz[$i]; //判斷是否為上傳文件 if(is_uploaded_file($_FILES['myfile']['tmp_name'][$i])){ if(!move_uploaded_file($_FILES['myfile']['tmp_name'][$i],$path.'/'.$filename[$i])){ die("不能將文件移動到指定目錄"); } }else{ die("上傳文件{$_FILES['myfile']['name'][$i]}不是一個合法文件"); } //如果文件上傳成功 $filesize[$i] = $_FILES['myfile']['size'][$i]/1024; echo "文件{$upfile[$i]}上傳成功,保存在目錄{$path}中,文件大小為{$filesize[$i]}KB<br>"; }
頁面顯示:
文件87d11a09d24848fa3ac763fe.jpg上傳成功,保存在目錄./uploads中,文件大小為34.60546875KB
文件0ef5e0fef0adab0f5c6008a2.jpg上傳成功,保存在目錄./uploads中,文件大小為37.810546875KB
文件2dbda88c96801dd6f11f3617.jpg上傳成功,保存在目錄./uploads中,文件大小為168.0478515625KB