php檔案上傳介紹
?
PHP手冊第39章有關於處理這些問題的說明,我複製粘貼如下:
--------------------------------------------
第?39?章?檔案上傳處理
目錄
POST?方法上傳
錯誤資訊說明
常見缺陷
上傳多個檔案
對?PUT?方法的支援
POST?方法上傳
本特性可以使使用者上傳文本和二進位檔案。用?PHP?的認證和檔案操作函數,可以完全控制允許哪些人上傳以及檔案上傳後怎樣處理。?
PHP?能夠接受任何來自符合?RFC-1867?標準的瀏覽器(包括?Netscape?Navigator?3?及更高版本,打了補丁的?Microsoft?Internet?Explorer?3?或者更高版本)上傳的檔案。?
相關的設定:?請參閱?php.ini?的?file_uploads,upload_max_filesize,upload_tmp_dirpost_max_size?以及?max_input_time?設定選項。?
請注意?PHP?也支援?PUT?方法的檔案上傳,Netscape?Composer?和?W3C?的?Amaya?用戶端使用這種方法。請參閱對?PUT?方法的支援以擷取更多資訊。?
例?39.1.?檔案上傳表單
可以如下建立一個特殊的表單來支援檔案上傳:?
????
????
以上範例中的?__URL__?應該被換掉,指向一個真實的?PHP?檔案。?
MAX_FILE_SIZE?隱藏欄位(單位為位元組)必須放在檔案輸入欄位之前,其值為接收檔案的最大尺寸。這是對瀏覽器的一個建議,PHP?也會檢查此項。在瀏覽器端可以簡單繞過此設定,因此不要指望用此特性來阻擋大檔案。實際上,PHP?設定中的上傳檔案最大值是不會失效的。但是最好還是在表單中加上此項目,因為它可以避免使用者在花時間等待上傳大檔案之後才發現檔案過大上傳失敗的麻煩。?
注意:?要確保檔案上傳表單的屬性是?enctype="multipart/form-data",否則檔案上傳不了。?
全域變數?$_FILES?自?PHP?4.1.0?起存在(在更早的版本中用?$HTTP_POST_FILES?替代)。此數組包含有所有上傳的檔案資訊。?
以上範例中?$_FILES?數組的內容如下所示。我們假設檔案上傳欄位的名稱如上例所示,為?userfile。名稱可隨意命名。?
$_FILES['userfile']['name']
用戶端機器檔案的原名稱。?
$_FILES['userfile']['type']
檔案的?MIME?類型,如果瀏覽器提供此資訊的話。一個例子是“image/gif”。不過此?MIME?類型在?PHP?端並不檢查,因此不要想當然認為有這個值。?
$_FILES['userfile']['size']
已上傳檔案的大小,單位為位元組。?
$_FILES['userfile']['tmp_name']
檔案被上傳後在服務端儲存的臨時檔案名稱。?
$_FILES['userfile']['error']
和該檔案上傳相關的錯誤碼。此項目是在?PHP?4.2.0?版本中增加的。?
檔案被上傳後,預設地會被儲存到服務端的預設臨時目錄中,除非?php.ini?中的?upload_tmp_dir?設定為其它的路徑。服務端的預設臨時目錄可以通過更改?PHP?運行環境的環境變數?TMPDIR?來重新設定,但是在?PHP?指令碼內部通過運行?putenv()?函數來設定是不起作用的。該環境變數也可以用來確認其它的操作也是在上傳的檔案上進行的。?
例?39.2.?使檔案上傳生效
請查閱函數?is_uploaded_file()?和?move_uploaded_file()?以擷取進一步的資訊。以下範例處理由表單提供的檔案上傳。?
//?In?PHP?versions?earlier?than?4.1.0,?$HTTP_POST_FILES?should?be?used?instead
//?of?$_FILES.
$uploaddir?=?'/var/www/uploads/';
$uploadfile?=?$uploaddir?.?basename($_FILES['userfile']['name']);
echo?'
';
if?(move_uploaded_file($_FILES['userfile']['tmp_name'],?$uploadfile))?{
????echo?"File?is?valid,?and?was?successfully?uploaded.\n";
}?else?{
????echo?"Possible?file?upload?attack!\n";
}
echo?'Here?is?some?more?debugging?info:';
print_r($_FILES);
print?"
";
?>?
接受上傳檔案的?PHP?指令碼為了決定接下來要對該檔案進行哪些操作,應該實現任何邏輯上必要的檢查。例如可以用?$_FILES['userfile']['size']?變數來排除過大或過小的檔案,也可以通過?$_FILES['userfile']['type']?變數來排除檔案類型和某種標準不相符合的檔案,但只把這個當作一系列檢查中的第一步,因為此值完全由用戶端控制而在?PHP?端並不檢查。自?PHP?4.2.0?起,還可以通過?$_FILES['userfile']['error']?變數來根據不同的錯誤碼來計划下一步如何處理。不管怎樣,要麼將該檔案從臨時目錄中刪除,要麼將其移動到其它的地方。?
如果表單中沒有選擇上傳的檔案,則?PHP?變數?$_FILES['userfile']['size']?的值將為?0,$_FILES['userfile']['tmp_name']?將為空白。?
如果該檔案沒有被移動到其它地方也沒有被改名,則該檔案將在表單請求結束時被刪除。?
例?39.3.?上傳一組檔案
PHP?的?HTML?數組特性甚至支援檔案類型。?
???
foreach?($_FILES["pictures"]["error"]?as?$key?=>?$error)?{
????if?($error?==?UPLOAD_ERR_OK)?{
????????$tmp_name?=?$_FILES["pictures"]["tmp_name"][$key];
????????$name?=?$_FILES["pictures"]["name"][$key];
????????move_uploaded_file($tmp_name,?"data/$name");
????}
}
?>
?