久久精品水蜜桃av综合天堂,久久精品丝袜高跟鞋,精品国产肉丝袜久久,国产一区二区三区色噜噜,黑人video粗暴亚裔

PHP POST上傳文件

2024-01-11 144

PHP中的POST 特性可以使用戶上傳文本和二進制文件。在PHP中,我們可以使用$_FILES超全局變量來處理文件上傳;通過使用 PHP 的認證和文件操作函數(shù),可以完全控制哪些人被允許上傳以及如何處理已上傳的文件。

PHP 能夠接受來自符合 RFC-1867 標(biāo)準(zhǔn)的瀏覽器的任何文件上傳。

一、文件上傳表單

可以如下建立一個特殊的表單來支持文件上傳:

<!-- 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)該被換掉,指向一個真實的 PHP 文件。

MAX_FILE_SIZE 隱藏字段(單位為字節(jié))必須放在文件輸入字段之前,其值為接收文件的最大尺寸。這是對瀏覽器的一個建議,PHP 也會檢查此項。在瀏覽器端可以簡單繞過此設(shè)置,因此不要指望用此特性來阻擋大文件。實際上,PHP 設(shè)置中的上傳文件最大值是不會失效的。但是最好還是在表單中加上此項目,因為它可以避免用戶在花時間等待上傳大文件之后才發(fā)現(xiàn)文件過大上傳失敗的麻煩。

注意:要確保文件上傳表單的屬性是 enctype=”multipart/form-data”,否則文件上傳不了。

二、$_FILES

全局變量 $_FILES 包含有所有上傳的文件信息。 數(shù)組的內(nèi)容來自以下范例表單。我們假設(shè)文件上傳字段的名稱如下例所示,為 userfile,名稱可隨意命名。

  • $_FILES[‘userfile’][‘name’]:客戶端機器文件的原名稱。
  • $_FILES[‘userfile’][‘type’]:文件的 MIME 類型,如果瀏覽器提供此信息的話。一個例子是“image/gif”。不過此 MIME 類型在 PHP 端并不檢查,因此不要想當(dāng)然認為有這個值。
  • $_FILES[‘userfile’][‘size’]:已上傳文件的大小,單位為字節(jié)。
  • $_FILES[‘userfile’][‘tmp_name’]:文件被上傳后在服務(wù)端儲存的臨時文件名。
  • $_FILES[‘userfile’][‘error’]:和該文件上傳相關(guān)的錯誤代碼。
  • $_FILES[‘userfile’][‘full_path’]:瀏覽器提交的完整路徑。該值并不總是包含真實的目錄結(jié)構(gòu),因此不能被信任。從 PHP 8.1.0 起可用。

文件被上傳后,默認地會被儲存到服務(wù)端的默認臨時目錄中,除非 php.ini 中的 upload_tmp_dir 設(shè)置為其它的路徑。服務(wù)端的默認臨時目錄可以通過更改 PHP 運行環(huán)境的環(huán)境變量 TMPDIR 來重新設(shè)置,但是在 PHP 腳本內(nèi)部通過運行 putenv() 函數(shù)來設(shè)置是不起作用的。該環(huán)境變量也可以用來確認其它的操作也是在上傳的文件上進行的。

三、驗證上傳的文件

以下范例處理由表單提供的文件上傳:

<?php
$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 腳本為了決定接下來要對該文件進行哪些操作,應(yīng)該實現(xiàn)任何邏輯上必要的檢查。例如可以用 $_FILES[‘userfile’][‘size’] 變量來排除過大或過小的文件,也可以通過 $_FILES[‘userfile’][‘type’] 變量來排除文件類型和某種標(biāo)準(zhǔn)不相符合的文件,但只把這個當(dāng)作一系列檢查中的第一步,因為此值完全由客戶端控制而在 PHP 端并不檢查。

同時,還可以通過 $_FILES[‘userfile’][‘error’] 變量來根據(jù)不同的錯誤代碼來計劃下一步如何處理。不管怎樣,要么將該文件從臨時目錄中刪除,要么將其移動到其它的地方。

  • 如果表單中沒有選擇上傳的文件,則 PHP 變量 $_FILES[‘userfile’][‘size’] 的值將為 0,$_FILES[‘userfile’][‘tmp_name’] 將為空。
  • 如果該文件沒有被移動到其它地方也沒有被改名,則該文件將在表單請求結(jié)束時被刪除。

四、上傳一組文件

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>
<?php
foreach ($_FILES["pictures"]["error"] as $key => $error) {
if ($error == UPLOAD_ERR_OK) {
$tmp_name = $_FILES["pictures"]["tmp_name"][$key];
// basename() may prevent filesystem traversal attacks;
// further validation/sanitation of the filename may be appropriate
$name = basename($_FILES["pictures"]["name"][$key]);
move_uploaded_file($tmp_name, "data/$name");
}
}
?>
  • 廣告合作

  • QQ群號:4114653

溫馨提示:
1、本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享網(wǎng)絡(luò)內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。郵箱:2942802716#qq.com(#改為@)。 2、本站原創(chuàng)內(nèi)容未經(jīng)允許不得轉(zhuǎn)裁,轉(zhuǎn)載請注明出處“站長百科”和原文地址。