對(duì)文件上傳處理過程的進(jìn)一步說明
發(fā)表時(shí)間:2023-07-30 來源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]近來工作不是太忙,所以有空寫一點(diǎn)東西來共同學(xué)習(xí)、提高PHP的技術(shù)。向服務(wù)器上傳文件,是我們做項(xiàng)目時(shí)經(jīng)常用的一種技術(shù)。做過ASP開發(fā)的知道,ASP對(duì)上傳文件很無耐,至少得需要借組其它手段,如自己寫VB...
近來工作不是太忙,所以有空寫一點(diǎn)東西來共同學(xué)習(xí)、提高PHP的技術(shù)。
向服務(wù)器上傳文件,是我們做項(xiàng)目時(shí)經(jīng)常用的一種技術(shù)。做過ASP開發(fā)的知道,ASP對(duì)上傳文件很無耐,至少得需要借組其它手段,如自己寫VB代碼、利用免費(fèi)上傳組件等,可謂痛苦之極。好在PHP發(fā)開發(fā)者為我們寫好上傳函數(shù),使PHP可以輕而易舉的上傳文本文件、甚至二進(jìn)制文件。所以在進(jìn)行ASP開發(fā)的戰(zhàn)友們,快快轉(zhuǎn)行到我們的PHP開發(fā)吧,呵呵~~
一、上傳單個(gè)文件
您可以如下建立一個(gè)特殊的表單來支持文件上傳:
文件上傳表單<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應(yīng)該指向一個(gè)處理上傳文件的 PHP 文件。 MAX_FILE_SIZE隱藏字段必須在文件輸入字段之前,且其值為接受文件的最大尺寸,單位是字節(jié)。
注意,該值實(shí)際上并不能真正地在客戶端控制上傳文件的大小。
上傳動(dòng)作產(chǎn)生的文件信息存放于特定的數(shù)組中,數(shù)組的名字會(huì)根據(jù)PHP的版本和配置文件的設(shè)置不同而不同。全局變量 _FILES 數(shù)組從PHP4.1.0版本就已經(jīng)開始支持了。而 $HTTP_POST_FILES 數(shù)組是從PHP4.0.0開始支持的。 不過這里推薦您使用 _FILES 數(shù)組,因?yàn)閜hp.ini里的 register_globals 設(shè)置為 off 時(shí),相關(guān)的變量名還可以使用,而且從PHP4.2.0版本開始,它已經(jīng)設(shè)置為 off 。這里也不主張您改為 ON。
在剛才的表單后面加上phpinfo();函數(shù),提交一下表單,就會(huì)看到 _FILES 數(shù)組的內(nèi)容:
$_FILES['myFile']['name']客戶端文件的原名稱,同ON時(shí)的 $myFile_name,下同。
$_FILES['myFile']['type']文件的 MIME類型,需要瀏覽器提供該信息的支持,例如“image/gif”。
$_FILES['myFile']['size']已上傳文件的大小,單位為字節(jié)。
$_FILES['myFile']['tmp_name']文件被上傳后在服務(wù)端儲(chǔ)存的臨時(shí)文件名,一般是系統(tǒng)默認(rèn)。可以在php.ini的upload_tmp_dir 指定,但 用 putenv() 函數(shù)設(shè)置是不起作用的。
$_FILES['myFile']['error']和該文件上傳相關(guān)的錯(cuò)誤代碼。['error'] 是在 PHP 4.2.0 版本中增加的。下面是它的說明:(它們?cè)赑HP3.0以后成了常量)
UPLOAD_ERR_OK
值:0; 沒有錯(cuò)誤發(fā)生,文件上傳成功。
UPLOAD_ERR_INI_SIZE
值:1; 上傳的文件超過了 php.ini 中 upload_max_filesize 選項(xiàng)限制的值。
UPLOAD_ERR_FORM_SIZE
值:2; 上傳文件的大小超過了 HTML 表單中 MAX_FILE_SIZE 選項(xiàng)指定的值。
UPLOAD_ERR_PARTIAL
值:3; 文件只有部分被上傳。
UPLOAD_ERR_NO_FILE
值:4; 沒有文件被上傳。
值:5; 上傳文件大小為0.
文件被上傳結(jié)束后,默認(rèn)地被存儲(chǔ)在了臨時(shí)目錄中,這時(shí)您必須將它從臨時(shí)目錄中刪除或移動(dòng)到其它地方,如果沒有,則會(huì)被刪除。也就是不管是否上傳成功,腳本執(zhí)行完后臨時(shí)目錄里的文件肯定會(huì)被刪除。所以在刪除之前要用PHP的 copy() 函數(shù)將它復(fù)制到其它位置,此時(shí),才算完成了我們的上傳文件過程。
二、上傳多個(gè)文件
有了上面的認(rèn)識(shí),同時(shí)上傳多個(gè)文件也就不難做了。上傳多個(gè)文件是從PHP3.0.10版本開始被支持。要完成它,只需文件名以數(shù)組形式表示即可:
<form action="file-upload.php" method="post" enctype="multipart/form-data">
<input name="myFile[]" type="file"><br>
<input name="myFile[]" type="file"><br>
<input type="submit" value="上傳多個(gè)文件">
</form>
假如我們上傳了兩個(gè)文件:first.txt 和 second.gif。表單被提交后,
$_FILES["myFile"]["name"][0]、$_FILES["myFile"]["size"][0]分別指first.txt文件的名字和大小,
$_FILES["myFile"]["name"][1]、$_FILES["myFile"]["size"][1]分別指 second.gif 的文件名字和大小。當(dāng)然,$_FILES["myFile"]["tmp_name"]、$_FILES["myFile"]["type"]也同樣會(huì)產(chǎn)生。
三、注意事項(xiàng)
1.對(duì) MAX_FILE_SIZE 設(shè)置的值,不能大于 ini 設(shè)置中 upload_max_filesize 選項(xiàng)設(shè)置的值。其默認(rèn)值為 2M 字節(jié)。
2.如果 max_execution_time 設(shè)置的值太小,腳本運(yùn)行的時(shí)間可能會(huì)超過該設(shè)置。也就是文件還未上傳成功已經(jīng)到了結(jié)束時(shí)間。因此,請(qǐng)保證 max_execution_time 足夠的大。
3.如果內(nèi)存限制設(shè)置被激活,您可能需要將 memory_limit 設(shè)置的更大些,所以也請(qǐng)確認(rèn) memory_limit 的設(shè)置足夠的大。
4.如果 post_max_size 設(shè)置的值太小,則較大的文件會(huì)無法被上傳。因此,請(qǐng)保證 post_max_size 的值足夠的大。
5.不能保證文件名有空格的文件被正確上傳。
四、PUT方式上傳
上面的上傳單個(gè)、多個(gè)文件,均是在<form>表單里以POST方式上傳到服務(wù)器里的。不過據(jù)說PHP 提供了對(duì) Netscape Composer 和 W3C Amaya 等客戶端以 HTTP PUT 方法上傳文件的支持。這樣的安全性怎么樣我不清楚,手頭也沒有類似資料,希望了解此方式的網(wǎng)友們提供一些資料和討論,這里先謝過了^_^。
五、一些說明
1.要想上傳文件,得保證服務(wù)器沒有關(guān)閉臨時(shí)文件和有對(duì)文件夾的寫權(quán)限
2.這里只是簡(jiǎn)單的說明上傳參數(shù),具體的步驟和需要可以參看精華區(qū)的貼子,如控制文件類型等。
3.由于是在匆忙中完全,肯定會(huì)有所漏洞和遺漏,歡迎跟貼補(bǔ)充、討論。
4.參考:php.net在線幫助
erquan
2002/2/27 上午于鄭州