--- tags: 挑戰PHP7/MySQL程式設計與超強專題特訓班(第四版) --- # ch9 檔案的處理(9.4) ## 9.4 檔案上傳 ### [PHP 單檔案上傳、多檔案上傳教學範例](https://www.footmark.info/programming-language/php/php-uploads/) ### 9.4.1 檔案上傳的原理 在網頁中將檔案由客戶端上傳到伺服器中,傳送的過程如下:  **1. 在表單檔案欄位選取要上傳的檔案。** **2. 表單送出,將檔案傳送到伺服器。** **3. 伺服器在接收的過程中,先將接收到的檔案放置在暫存資料夾中。** **4. 傳送完畢後將完整的檔案搬移到指定的網頁資料夾中。** 在整個過程中最重要的環節,在於傳送資料的表單與接收資料的程式。檔案上傳的動作,因為是利用表單傳送二進位的資料,有別於一般表單只傳送文字訊息的動作,所以在表單的佈置上就不同於一般的表單。**而接收端的程式,也因為要接收二進位資料,所以要處理暫存檔及搬移到指定資料夾的動作。** ----- ### 9.4.2 <php.ini> 在檔案上傳功能上的調整 ### => 是否允許上傳 開啟允許網頁伺服器允許上傳的設定: ``` file_uploads = On ```  ### =>暫存檔資料夾 在檔案上傳到網頁伺服器時會先放在暫存資料夾,完成後才搬到指定資料夾。若沒有設定會造成上傳失敗。若在 Windows 系統中,可以參考以下設定: ``` upload_tmp_dir="C:\Windows\Temp" ``` 該資料夾必須真的存在,並且要有寫入的權限,若是 Linux 作業系統,可以參考: ``` upload_tmp_dir="/tmp" ```  ### =>可接受上傳檔案大小 **可設定伺服器能夠接受上傳檔案的大小**,若設的太大會因為程式執行過長而造成失敗,設的太小可能會影響程式的適用性。在<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 大小上限(所有檔案大小加總)  **修改完畢後,請停止伺服器後再重新啟動,讓網頁伺服器可以適用修改後的環境**。 ------- ### 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> ```  ------ ### 9.4.4 接收上傳的檔案 程式端接收到檔案,並不是馬上將檔案放置到指定的資料夾中,而是先將檔案儲存成暫存檔,在完成檔案傳輸後再將檔案搬移到指定資料夾。 ### 取得暫存檔資訊 使用 $_FILES 取得暫存檔的資訊,表列如下: | 函式名稱 | 說明與範例 | | -------- | -------- | | $_FILES[欄位名稱]["tmp_name"] | 取得上傳檔案暫存檔名稱 | | $_FILES[欄位名稱]["name"] | 取得上傳檔案原來名稱 | | $_FILES[欄位名稱]["type"] | 取得上傳檔案類型,常見如 text/plain (文字檔)、image/pjpeg (JPEG圖片檔) | | $_FILES[欄位名稱]["size"] | 錯誤碼,其值說明如下: | 如此即可取得上傳檔案的詳細資訊,甚至能夠藉由錯誤碼的回傳,進行相關的處理。暫存檔的產生並非真的完成檔案上傳,還必須將檔案移至指定的資料夾,並重新命名才算是真正完成上傳的動作,以下將繼續說明處理的動作。 ### 完成檔案上傳 我們在接收檔案的程式頁面,可以在檔案上傳完畢之後,將暫存檔移至指定資料夾以完成上傳動作,這時候可以使用 move_uploaded_file() 函式來操作,其格式如下: ``` move_uploaded_file (暫存檔案名稱,目的路徑及檔名) ```   ### [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 多檔上傳 **表單欄位以陣列方式傳送**  > 佈置三個檔案上傳的欄位,名稱皆為 「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 />"; } } } ?> ```  ### 同檔名多檔上傳,只會保留一個  ### [[筆記] PHP:判斷檔案是否存在,並將檔案刪除](https://pjchender.blogspot.com/2015/04/php.html) --------- ### 變更PHP上傳檔案的名稱 --- ### [ch9.5 讀取及寫入檔案的內容](https://hackmd.io/u0dw0XYIQc6FHS2K6zhSQg)
×
Sign in
Email
Password
Forgot password
or
Sign in via Google
Sign in via Facebook
Sign in via X(Twitter)
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
Continue with a different method
New to HackMD?
Sign up
By signing in, you agree to our
terms of service
.