核心差異速查表
| 特性 | application/x-www-form-urlencoded (預設) | multipart/form-data |
| 適用場景 | 一般文字表單、小量資料 | 檔案上傳、大量文字、非 ASCII 字元、二進位資料 |
| 編碼方式 | URL 編碼(空格→+,特殊字元→%XX) | 多部分 MIME,各欄位獨立區塊,含 Content-Disposition |
| 效率 | 小資料高效 | 大資料/二進位高效,無需 URL 編碼轉換 |
| HTTP Method | GET/POST 皆可 | 必須使用 POST |
| input type | text, hidden, select 等 | 必須包含 type="file" |
| 伺服器解析 | $_POST 自動填入 | $_FILES + $_POST,需啟用 multipart 解析 |
何時使用 multipart/form-data?
- 表單包含
<input type="file"> 檔案上傳欄位
- 提交大量文字內容(如富文本編輯器內容)
- 資料含非 ASCII 字元(中文、日文、Emoji 等)
- 需傳輸二進位資料(圖片、PDF、二進位 Blob)
HTML 表單寫法對比
一般表單(預設編碼)
<form action="submit.php" method="post">
<input type="text" name="username">
<input type="password" name="password">
<button type="submit">登入</button>
</form>
檔案上傳表單(必須指定 enctype)
<form action="upload.php" method="post" enctype="multipart/form-data">
<input type="hidden" name="MAX_FILE_SIZE" value="2000000">
<input type="file" name="avatar" accept="image/*">
<button type="submit">上傳頭像</button>
</form>
伺服器端處理差異
// application/x-www-form-urlencoded
$_POST['username']; // 直接取得
// multipart/form-data
$_POST['description']; // 一般文字欄位
$_FILES['avatar']['tmp_name']; // 上傳檔案暫存路徑
$_FILES['avatar']['name']; // 原始檔名
$_FILES['avatar']['type']; // MIME 類型
$_FILES['avatar']['size']; // 檔案大小
$_FILES['avatar']['error']; // 錯誤代碼(0=成功)
常見錯誤與除錯
- 忘記加 enctype:導致
$_FILES 為空,上傳失敗
- 使用 GET 方法:multipart 僅支援 POST,GET 會截斷資料
- php.ini 限制:檢查
file_uploads=On、upload_max_filesize、post_max_size
- Nginx/Apache 客戶端上傳大小限制:需同步調整
client_max_body_size / LimitRequestBody