--- tags: 挑戰PHP7/MySQL程式設計與超強專題特訓班(第四版) --- # ch9 檔案的處理(9.4) ## 9.4 檔案上傳 ### [PHP 單檔案上傳、多檔案上傳教學範例](https://www.footmark.info/programming-language/php/php-uploads/) ### 9.4.1 檔案上傳的原理 在網頁中將檔案由客戶端上傳到伺服器中,傳送的過程如下: ![](https://i.imgur.com/0FWQdAx.png) **1. 在表單檔案欄位選取要上傳的檔案。** **2. 表單送出,將檔案傳送到伺服器。** **3. 伺服器在接收的過程中,先將接收到的檔案放置在暫存資料夾中。** **4. 傳送完畢後將完整的檔案搬移到指定的網頁資料夾中。** 在整個過程中最重要的環節,在於傳送資料的表單與接收資料的程式。檔案上傳的動作,因為是利用表單傳送二進位的資料,有別於一般表單只傳送文字訊息的動作,所以在表單的佈置上就不同於一般的表單。**而接收端的程式,也因為要接收二進位資料,所以要處理暫存檔及搬移到指定資料夾的動作。** ----- ### 9.4.2 <php.ini> 在檔案上傳功能上的調整 ### => 是否允許上傳 開啟允許網頁伺服器允許上傳的設定: ``` file_uploads = On ``` ![](https://i.imgur.com/72wH5f5.png) ### =>暫存檔資料夾 在檔案上傳到網頁伺服器時會先放在暫存資料夾,完成後才搬到指定資料夾。若沒有設定會造成上傳失敗。若在 Windows 系統中,可以參考以下設定: ``` upload_tmp_dir="C:\Windows\Temp" ``` 該資料夾必須真的存在,並且要有寫入的權限,若是 Linux 作業系統,可以參考: ``` upload_tmp_dir="/tmp" ``` ![](https://i.imgur.com/Yl4ZAe4.png) ### =>可接受上傳檔案大小 **可設定伺服器能夠接受上傳檔案的大小**,若設的太大會因為程式執行過長而造成失敗,設的太小可能會影響程式的適用性。在<php.ini> 中預設的大小為2MB,建議可調整為 8 MB 到 10 MB之間,適用於大部分的需求。 ``` upload_max_filesize= 8M ``` ### [解除 PHP 上傳大檔案限制,修改 php.ini 設定檔](https://blog.gtwang.org/web-development/php-ini-large-file-upload-configuration/) * upload_max_filesize,是指單一檔案大小 * post_max_size = 200M,POST 大小上限(所有檔案大小加總) ![](https://i.imgur.com/51By6Qv.png) **修改完畢後,請停止伺服器後再重新啟動,讓網頁伺服器可以適用修改後的環境**。 ------- ### 9.4.3 檔案上傳的表單 上傳檔案的表單,有幾個重要的注意事項: 1. 在 <form> 標籤中 「action」屬性必須設定要接收檔案的 PHP 程式檔。 2. 在 <form> 標籤中,傳送方式屬性必須要設定為「method="post"」,因為檔案上傳表單的傳送一定要使用 POST 的方法。 3. 在 <form> 標籤中,因為有檔案傳送的動作,所以要設定資料的編碼方式,這裡要加上「enctype="multipart/form-data"」的屬性,才能正確地讓檔案欄位送出。 4. 上傳的檔案欄位為 <input> 標籤,屬性必須設定「type="file"」,如次即可在使用時出現 **瀏覽** 鈕,讓使用者選取要上傳的檔案。 ### 簡易的上傳檔案表單: ``` <form action="php_file9.php" method="post" enctype="multipart/form-data"> 請選取要上傳的檔案:<br /> <input type="file" name="fileUpload" /><br /> <input type="submit" value="送出資料" /> </form> ``` ![](https://i.imgur.com/4AX1HXg.png) ------ ### 9.4.4 接收上傳的檔案 程式端接收到檔案,並不是馬上將檔案放置到指定的資料夾中,而是先將檔案儲存成暫存檔,在完成檔案傳輸後再將檔案搬移到指定資料夾。 ### 取得暫存檔資訊 使用 $_FILES 取得暫存檔的資訊,表列如下: | 函式名稱 | 說明與範例 | | -------- | -------- | | $_FILES[欄位名稱]["tmp_name"] | 取得上傳檔案暫存檔名稱 | | $_FILES[欄位名稱]["name"] | 取得上傳檔案原來名稱 | | $_FILES[欄位名稱]["type"] | 取得上傳檔案類型,常見如 text/plain (文字檔)、image/pjpeg (JPEG圖片檔) | | $_FILES[欄位名稱]["size"] | 錯誤碼,其值說明如下:![](https://i.imgur.com/ND8oOQ2.png) | 如此即可取得上傳檔案的詳細資訊,甚至能夠藉由錯誤碼的回傳,進行相關的處理。暫存檔的產生並非真的完成檔案上傳,還必須將檔案移至指定的資料夾,並重新命名才算是真正完成上傳的動作,以下將繼續說明處理的動作。 ### 完成檔案上傳 我們在接收檔案的程式頁面,可以在檔案上傳完畢之後,將暫存檔移至指定資料夾以完成上傳動作,這時候可以使用 move_uploaded_file() 函式來操作,其格式如下: ``` move_uploaded_file (暫存檔案名稱,目的路徑及檔名) ``` ![](https://i.imgur.com/QVAo87j.png) ![](https://i.imgur.com/CCUIHLV.png) ### [php上傳圖片筆記](https://ithelp.ithome.com.tw/articles/10213998?sc=pt) ### [網頁 input 使用 accept 限制上傳檔案類型](https://blog.gtwang.org/web-development/html-input-accept-attribute-tutorial/) ----- ### 9.4.5 多檔上傳 **表單欄位以陣列方式傳送** ![](https://i.imgur.com/6XWhoY2.png) > 佈置三個檔案上傳的欄位,名稱皆為 「fileUpload[]」。 ### 上傳三個檔案: ``` <?php $i=count($_FILES["fileUpload"]["name"]); for ($j=0;$j<$i;$j++){ if($_FILES["fileUpload"]["error"][$j]==0){ if(move_uploaded_file($_FILES["fileUpload"]["tmp_name"][$j], "./img/".$_FILES["fileUpload"]["name"][$j])){ echo $_FILES["fileUpload"]["name"][$j]."上傳成功!<br />"; }else{ echo $_FILES["fileUpload"]["name"][$j]."上傳失敗!<br />"; } } } ?> ``` ![](https://i.imgur.com/nAFOnqJ.png) ### 同檔名多檔上傳,只會保留一個 ![](https://i.imgur.com/XAMrkHF.png) ### [[筆記] PHP:判斷檔案是否存在,並將檔案刪除](https://pjchender.blogspot.com/2015/04/php.html) --------- ### 變更PHP上傳檔案的名稱 --- ### [ch9.5 讀取及寫入檔案的內容](https://hackmd.io/u0dw0XYIQc6FHS2K6zhSQg)