向服務器上傳文件,是我們做項目時經常用的一種技術。做過ASP開發的知道,ASP對上傳文件很無耐,至少得需要借組其它手段,如自己寫VB代碼、利用免費上傳組件等,可謂痛苦之極。好在PHP開發者為我們寫好上傳函數,使PHP可以輕而易舉的上傳文本文件、甚至二進制文件。所以在進行ASP開發的戰友們,快快轉行到我們的PHP開發吧,呵呵~~
一、上傳單個文件
您可以如下建立一個特殊的表單來支持文件上傳:
文件上傳表單
<form enctype="multipart/form-data" action="URL" method="post">
<input type="hidden" name="MAX_FILE_SIZE" value="1000">
<input name="myFile" type="file">
<input type="submit" value="上傳文件">
</form>
這裡的URL應該指向一個處理上傳文件的 PHP 文件。 MAX_FILE_SIZE隱藏字段必須在文件輸入字段之前,且其值為接受文件的最大尺寸,單位是字節。 注意,該值實際上並不能真正地在客戶端控制上傳文件的大小。
上傳動作產生的文件信息存放於特定的數組中,數組的名字會根據PHP的版本和配置文件的設置不同而不同。全局變量 _FILES 數組從PHP4.1.0版本就已經開始支持了。而 $HTTP_POST_FILES 數組是從PHP4.0.0開始支持的。 不過這裡推薦您使用 _FILES 數組,因為php.ini裡的 register_globals 設置為 off 時,相關的變量名還可以使用,而且從PHP4.2.0版本開始,它已經設置為 off 。這裡也不主張您改為 ON。
在剛才的表單後面加上phpinfo();函數,提交一下表單,就會看到 _FILES 數組的內容:
$_FILES['myFile']['name'] 客戶端文件的原名稱,同ON時的 $myFile_name,下同。
$_FILES['myFile']['type'] 文件的 MIME 類型,需要浏覽器提供該信息的支持,例如“image/gif”。
$_FILES['myFile']['size'] 已上傳文件的大小,單位為字節。
$_FILES['myFile']['tmp_name'] 文件被上傳後在服務端儲存的臨時文件名,一般是系統默認。可以在php.ini的upload_tmp_dir 指定,但 用 putenv() 函數設置是不起作用的。
$_FILES['myFile']['error'] 和該文件上傳相關的錯誤代碼。['error'] 是在 PHP 4.2.0 版本中增加的。下面是它的說明:(它們在PHP3.0以後成了常量)
UPLOAD_ERR_OK
值:0; 沒有錯誤發生,文件上傳成功。
UPLOAD_ERR_INI_SIZE
值:1; 上傳的文件超過了 php.ini 中 upload_max_filesize 選項限制的值。
UPLOAD_ERR_FORM_SIZE
值:2; 上傳文件的大小超過了 HTML 表單中 MAX_FILE_SIZE 選項指定的值。
UPLOAD_ERR_PARTIAL
值:3; 文件只有部分被上傳。
UPLOAD_ERR_NO_FILE
值:4; 沒有文件被上傳。
值:5; 上傳文件大小為0.
文件被上傳結束後,默認地被存儲在了臨時目錄中,這時您必須將它從臨時目錄中刪除或移動到其它地方,如果沒有,則會被刪除。也就是不管是否上傳成功,腳本執行完後臨時目錄裡的文件肯定會被刪除。所以在刪除之前要用PHP的 copy() 函數將它復制到其它位置,此時,才算完成了我們的上傳文件過程。