- Web開發的平民英雄:PHP+MySQL
- 丁月華 王鈞玉 孫更新等編著
- 889字
- 2018-12-27 18:50:29
2.2 文件上傳模塊
在PHP文件處理的功能上,還有一個重要的環節就是通過表單上傳本地文件到Web服務器,如訪客上傳照片、管理員上傳文件附件供訪客下載等。
要想上傳本地文件到服務器,必須使用表單POST方法,GET方法是不能實現此功能的,同時表單的enctype屬性也必須設置為“multipart/form-data”。如下一個實現文件上傳的表單。
<form name="up" action="" enctype="multipart/form-data" method="post"> <input name="file" type="file" size="60"/> <input name="ok" type="submit" value="上傳" /> </form>
文件上傳到服務器之后,PHP提供了$_FILES全局變量數組來包含所有上傳的文件信息。我們假設上傳文件的<input>控件名稱為“userfile”來說明$_FILES變量的元素:
$_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() 函數來設置是不起作用的。該環境變量也可以用來確認其他的操作,也是在上傳的文件上進行的。
接受上傳文件的PHP腳本為了決定接下來要對該文件進行哪些操作,應該實現任何邏輯上必要的檢查。例如可以用$_FILES['userfile']['size']變量來排除過大或過小的文件,也可以通過 $_FILES['userfile']['type']變量來排除文件類型和某種標準不相符合的文件,要么將該文件從臨時目錄中刪除,要么將其移動到其他的地方。
PHP提供了is_uploaded_file()函數來檢測某個文件是否為通過表單上傳的臨時文件,提供了move_uploaded_file()函數來將某個上傳來的臨時文件移動到其他指定目錄中去。仍舊假設上傳文件的<input>名為userfile:
<?php $uploaddir = '/uploads/'; $uploadfile = $uploaddir . basename($_FILES['userfile']['name']); if (is_uploaded_file($_FILES['userfile']['tmp_name']) && move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) { echo "文件已經成功上傳"; } else { echo "上傳文件處理出錯!"; } ?>
如果表單中沒有選擇上傳的文件,則PHP變量$_FILES['userfile']['size']的值將為0,$_FILES['userfile']['tmp_name']將為空。
如果該文件沒有被移動到其他地方也沒有被改名,則該文件將在表單請求結束時被刪除。
如果需要同時上傳多個文件到服務器,我們可以書寫多個文件上傳控件來實現此功能,通過$_FILES[]數組來分別調用這些上傳到服務器臨時目錄中的文件。
有一個竅門就是<input>控件的命名,可以類同checkbox多選框的命名,使用“[]”參與文件上傳控件命名構造一個數組結構方便服務器調用。如:
<form name="up" action="" enctype="multipart/form-data" method="post"> <input name="file[]" type="file" size="60"/> <input name="file[]" type="file" size="60"/> <input name="file[]" type="file" size="60"/> <input name="ok" type="submit" value="上傳" /> </form>
假設用這個表單提交了多張照片到服務器。
<?php foreach ($_FILES["file"]["error"] as $key => $error) { if ($error == UPLOAD_ERR_OK) { $tmp_name = $_FILES["file"]["tmp_name"][$key]; $name = $_FILES["file"]["name"][$key]; move_uploaded_file($tmp_name, "data/$name"); } } ?>
- C語言程序設計習題解析與上機指導(第4版)
- Mastering ServiceStack
- C# 從入門到項目實踐(超值版)
- 實用防銹油配方與制備200例
- Learning SciPy for Numerical and Scientific Computing(Second Edition)
- Vue.js 2 Web Development Projects
- SQL Server 2016 從入門到實戰(視頻教學版)
- Vue.js光速入門及企業項目開發實戰
- Angular Design Patterns
- 大話代碼架構:項目實戰版
- Bitcoin Essentials
- 歐姆龍PLC編程指令與梯形圖快速入門
- VMware vRealize Orchestrator Essentials
- Building Microservices with .NET Core 2.0(Second Edition)
- Neo4j Graph Data Modeling