終於到了最後一個章節了~~
最後這個章節要介紹的是如何上傳檔案,會搭配 html 的 form 標籤一起介紹~
而這個章節主要會分成 4 個小節來介紹,分別是…
- Post
- 上傳多個檔案
- 相關錯誤訊息
- 常見錯誤
因為翻譯的關係,所以章節的名稱會中英交錯,請多多包涵啦~ (其實是懶… XD
1. Post
第一小節主要要介紹如何使用 POST 方法將檔案上傳
而它的方式其實和 html 使用 form 標籤把資料傳到指定目的地是相同的,只是這次傳遞的資料是檔案的形式~
那我們先來提一下 PHP 是如何上傳檔案的吧~
- 透過 html 表單將檔案傳到指定目的地
- 在後端 PHP 程式碼的部分,前端傳過來的檔案資料全部都會記錄在 $_FILES 這個全域變數中
後續在 PHP 程式碼的部分再依據個人用途作客製化就完成啦~
居然這麼簡單?!
那底下就來詳細介紹吧~
1. html 表單
在 html 表單的部分有以下幾點需要注意的部分:
- form 標籤需要加上 enctype=”multiple/form-data” 這個屬性,才可以成功上傳檔案
- form 標籤的 action 屬性代表了上傳檔案的目的地
- input 標籤中的 name 屬性代表了它的名稱,在後端需要使用對應名稱去抓取對應的 input 欄位資料
- 若要提供選擇要上傳檔案的欄位的話,input 的 type 屬性需要設定成 file
就一起搭配底下的範例來看看吧~1
2
3
4<form enctype="multiple/form-data" action="__URL__" method="POST">
<input name="user_file" type="file"/>
<input type="submit" value="Send"/>
</form>
這樣就完成一個簡單的 form 表單了~
$_FILES
在 PHP 當中使用 $_FILES 這個全域變數來儲存所有前端傳來的檔案資料
而每個檔案都會分別有以下 5 個詳細資料
- $_FILES[‘user_file’][‘name’]: 檔案原名稱
- $_FILES[‘user_file’][‘type’]: 上傳檔案類型
- $_FILES[‘user_file’][‘size’]: 上傳檔案大小
- $_FILES[‘user_file’][‘tmp_name’]: 伺服器上的檔案暫存名稱
- $_FILES[‘user_file’][‘error’]: 若在上傳過程中有發生錯誤的話,則會將錯誤代碼記錄在這
2. 上傳多個檔案
想要上傳多個檔案有兩種方式
1. 使用不同的 input name
前面有說到後端會使用 input 標籤的 name 屬性去抓取對應的檔案資料
所以我們可以使用不同的 name 名稱去分別代表不同的 input 檔案
這樣可以達到同時上傳多個檔案的目的
2. 使用相同的陣列名稱
另一種方式是使用陣列的方式,一次將所有檔案都存到同個陣列中
如此一來就不需要為各個檔案都取不同的名稱囉~
1 | <form enctype="multiple/form-data" action="__URL__" method="POST"> |
而後端抓取的方式也是像陣列一樣
比如我要取得 user_file 的第一個檔案名稱的話就寫 $_FILES[‘user_file’][‘name’][0] 就可以囉~
非常方便吧~~
我個人會比較偏好使用第 2 種方式
不過具體還是看個人的喜好啦!
3. 相關錯誤訊息
這一章節會介紹所有上傳檔案相關的錯誤代碼
這邊再次小複習一下!
上傳檔案的錯誤代碼是在 $_FILES[‘fileName’][‘error’] 當中找到喔~
代碼常數名稱 | 代碼編號 | 介紹 |
---|---|---|
UPLOAD_ERR_OK | 0 | 成功上傳 |
UPLOAD_ERR_INT_SIZE | 1 | 上傳檔案大小超出 upload_max_filesize 限制 |
UPLOAD_ERR_FORM_SIZE | 2 | 上傳檔案大小超出 MAX_FILE_SIZE 限制 |
UPLOAD_ERR_PARTIAL | 3 | 檔案上傳不完全 |
UPLOAD_ERR_NO_FILE | 4 | 沒有檔案被上傳 |
UPLOAD_ERR_NO_TMP_DIR | 6 | 找不到暫存目錄 |
UPLOAD_ERR_CANT_WRITE | 7 | 表示檔案寫入硬碟失敗 |
UPLOAD_ERR_EXTENSION | 8 | 表示 PHP 的擴展程序導致檔案上傳失敗 |
這裡要提一下!!!
upload_max_filesize 和 MAX_FILE_SIZE 的差別
upload_max_filesize
它代表了最大可上傳的檔案大小
定義在 php.ini 設定檔中
可以透過修改 php.ini 去調整檔案上傳的大小限制
MAX_FILE_SIZE
這是定義在前端的 html 中
它只代表一個前端的軟性限制
通常會像如下的形式1
<input type="hidden" name="MAX_FILE_SIZE" value="30000"/>
它的用途在於…
當上傳的檔案超過這個的限制時,設定一個警示去通知檔案超出限制
避免到後端才發現檔案不符合
軟性的意思是指說
它並不是強制的! 只是一種推薦的寫法而以~
最主要的用途就是在前端先判斷好,避免把問題留到後端
一般會把 MAX_FILE_SIZE 的數值設定成和 upload_max_filesize 相同
如此一來檢查的數值才會相同!!!
4. 常見錯誤
以下有幾點上傳檔案常見的錯誤:
- MAX_FILE_SIZE 的數值超出 upload_max_filesize 的數值,就失去了前端提前判斷的功用
- 建議將 memory_limit 的數值設定大一點,避免有足夠的記憶體空間去執行相關的程式碼
- max_execution_times 的數值不該設定過低時,否則容易造成執行程式超時中斷
- max_input_time 是設定 POST、PUT.. 等接收資料相關方式的時間限制,若設定時間過低,當網速過低的時候就容易發生問題