---
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)