PHP特點(diǎn)之文件上傳1——使用POST方法上傳單文件和多文件
本特性可以使用戶上傳文本和二進(jìn)制文件。用 PHP 的認(rèn)證和文件操作函數(shù),可以完全控制允許哪些人上傳以及文件上傳后怎樣處理。
PHP 能夠接受任何來(lái)自符合 RFC-1867 標(biāo)準(zhǔn)的瀏覽器(包括?Netscape Navigator 3?及更高版本,打了補(bǔ)丁的?Microsoft Internet Explorer 3?或者更高版本)上傳的文件。
Note:?相關(guān)的設(shè)置
請(qǐng)參閱?php.ini?的?file_uploads,upload_max_filesize,upload_tmp_dirpost_max_size?以及?max_input_time?設(shè)置選項(xiàng)。
Example #1 文件上傳表單
可以如下建立一個(gè)特殊的表單來(lái)支持文件上傳:
<!-- The data encoding type, enctype, MUST be specified as below --><form enctype='multipart/form-data' action='__URL__' method='POST'> <!-- MAX_FILE_SIZE must precede the file input field --> <input type='hidden' name='MAX_FILE_SIZE' value='30000' /> <!-- Name of input element determines name in $_FILES array --> Send this file: <input name='userfile' type='file' /> <input type='submit' value='Send File' /></form>
以上范例中的?__URL__?應(yīng)該被換掉,指向一個(gè)真實(shí)的 PHP 文件。
MAX_FILE_SIZE?隱藏字段(單位為字節(jié))必須放在文件輸入字段之前,其值為接收文件的最大尺寸。這是對(duì)瀏覽器的一個(gè)建議,PHP 也會(huì)檢查此項(xiàng)。在瀏覽器端可以簡(jiǎn)單繞過(guò)此設(shè)置,因此不要指望用此特性來(lái)阻擋大文件。實(shí)際上,PHP 設(shè)置中的上傳文件最大值是不會(huì)失效的。但是最好還是在表單中加上此項(xiàng)目,因?yàn)樗梢员苊庥脩粼诨〞r(shí)間等待上傳大文件之后才發(fā)現(xiàn)文件過(guò)大上傳失敗的麻煩。
注意:
要確保文件上傳表單的屬性是?enctype='multipart/form-data',否則文件上傳不了。
全局變量?$_FILES?自 PHP 4.1.0 起存在(在更早的版本中用?$HTTP_POST_FILES?替代)。此數(shù)組包含有所有上傳的文件信息。
以上范例中?$_FILES?數(shù)組的內(nèi)容如下所示。我們假設(shè)文件上傳字段的名稱如上例所示,為?userfile。名稱可隨意命名。
$_FILES[’userfile’][’name’]客戶端機(jī)器文件的原名稱。$_FILES[’userfile’][’type’]文件的 MIME 類型,如果瀏覽器提供此信息的話。一個(gè)例子是“image/gif”。不過(guò)此 MIME 類型在 PHP 端并不檢查,因此不要想當(dāng)然認(rèn)為有這個(gè)值。$_FILES[’userfile’][’size’]已上傳文件的大小,單位為字節(jié)。$_FILES[’userfile’][’tmp_name’]文件被上傳后在服務(wù)端儲(chǔ)存的臨時(shí)文件名。$_FILES[’userfile’][’error’]和該文件上傳相關(guān)的錯(cuò)誤代碼。此項(xiàng)目是在 PHP 4.2.0 版本中增加的。文件被上傳后,默認(rèn)地會(huì)被儲(chǔ)存到服務(wù)端的默認(rèn)臨時(shí)目錄中,除非?php.ini?中的?upload_tmp_dir?設(shè)置為其它的路徑。服務(wù)端的默認(rèn)臨時(shí)目錄可以通過(guò)更改 PHP 運(yùn)行環(huán)境的環(huán)境變量?TMPDIR?來(lái)重新設(shè)置,但是在 PHP 腳本內(nèi)部通過(guò)運(yùn)行?putenv()?函數(shù)來(lái)設(shè)置是不起作用的。該環(huán)境變量也可以用來(lái)確認(rèn)其它的操作也是在上傳的文件上進(jìn)行的。
Example #2 使文件上傳生效
請(qǐng)查閱函數(shù)?is_uploaded_file()?和?move_uploaded_file()?以獲取進(jìn)一步的信息。以下范例處理由表單提供的文件上傳。
<?php// 在PHP4.1.0版本以前, 應(yīng)該使用$HTTP_POST_FILES來(lái)替代$_FILES.$uploaddir = ’/var/www/uploads/’;$uploadfile = $uploaddir . basename($_FILES[’userfile’][’name’]);echo ’<pre>’;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 '</pre>';?>
接受上傳文件的 PHP 腳本為了決定接下來(lái)要對(duì)該文件進(jìn)行哪些操作,應(yīng)該實(shí)現(xiàn)任何邏輯上必要的檢查。例如可以用?$_FILES[’userfile’][’size’]?變量來(lái)排除過(guò)大或過(guò)小的文件,也可以通過(guò)?$_FILES[’userfile’][’type’]?變量來(lái)排除文件類型和某種標(biāo)準(zhǔn)不相符合的文件,但只把這個(gè)當(dāng)作一系列檢查中的第一步,因?yàn)榇酥低耆煽蛻舳丝刂贫?PHP 端并不檢查。自 PHP 4.2.0 起,還可以通過(guò)?$_FILES[’userfile’][’error’]?變量來(lái)根據(jù)不同的錯(cuò)誤代碼來(lái)計(jì)劃下一步如何處理。不管怎樣,要么將該文件從臨時(shí)目錄中刪除,要么將其移動(dòng)到其它的地方。
如果表單中沒(méi)有選擇上傳的文件,則 PHP 變量?$_FILES[’userfile’][’size’]?的值將為 0,$_FILES[’userfile’][’tmp_name’]?將為空。
如果該文件沒(méi)有被移動(dòng)到其它地方也沒(méi)有被改名,則該文件將在表單請(qǐng)求結(jié)束時(shí)被刪除。
Example #3 上傳一組文件
PHP 的?HTML 數(shù)組特性甚至支持文件類型。
<form action='' method='post' enctype='multipart/form-data'><p>Pictures:<input type='file' name='pictures[]' /><input type='file' name='pictures[]' /><input type='file' name='pictures[]' /><input type='submit' value='Send' /></p></form><?phpforeach?($_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');????}}?>
相關(guān)文章:
1. python爬蟲實(shí)戰(zhàn)之制作屬于自己的一個(gè)IP代理模塊2. Ajax返回值類型與用法實(shí)例分析3. 如何在jsp界面中插入圖片4. 詳解盒子端CSS動(dòng)畫性能提升5. 使用FormData進(jìn)行Ajax請(qǐng)求上傳文件的實(shí)例代碼6. HTML 絕對(duì)路徑與相對(duì)路徑概念詳細(xì)7. asp批量添加修改刪除操作示例代碼8. .NET6打包部署到Windows Service的全過(guò)程9. 解決ajax請(qǐng)求后臺(tái),有時(shí)收不到返回值的問(wèn)題10. css代碼優(yōu)化的12個(gè)技巧
