在 PHP 開發中,檔案上傳是常見功能。許多開發者只檢查副檔名,卻忽略了瀏覽器回傳的 MIME 類型($_FILES['file']['type'])會因瀏覽器而異。同一個檔案,IE 與 Firefox 可能送出完全不同的 MIME 字串,導致驗證邏輯失效。本文整理最完整的對照表,並說明跨瀏覽器處理的關鍵點。
| ID | 副檔名 | IE 回傳 MIME | Firefox 回傳 MIME | 備註 |
|---|---|---|---|---|
| 0 | gif | image/gif | image/gif | 圖片檔 |
| 1 | jpg / jpeg | image/jpeg | image/pjpeg | |
| 2 | png | image/png | image/x-png | |
| 3 | bmp | image/bmp | image/bmp | |
| 4 | psd | application/octet-stream | application/octet-stream | |
| 5 | ico | image/x-icon | image/x-icon | |
| 6 | rar | application/octet-stream | application/octet-stream | 壓縮檔 |
| 7 | zip | application/zip | application/x-zip-compressed | |
| 8 | 7z | application/octet-stream | application/octet-stream | |
| 9 | exe | application/octet-stream | application/octet-stream | 可執行檔 |
| 10 | avi | video/avi | video/x-msvideo | 影音檔 |
| 11 | rmvb | application/vnd.rn-realmedia-vbr | application/vnd.rn-realmedia-vbr | |
| 12 | 3gp | application/octet-stream | application/octet-stream | |
| 13 | flv | application/octet-stream | application/octet-stream | |
| 14 | mp3 | audio/mpeg | audio/mpeg | 音訊檔 |
| 15 | wav | audio/wav | audio/x-wav | |
| 16 | krc | application/octet-stream | application/octet-stream | 歌詞檔 |
| 17 | lrc | application/octet-stream | application/octet-stream | |
| 18 | txt | text/plain | text/plain | 文件/文本 |
| 19 | doc | application/msword | application/msword | |
| 20 | xls | application/vnd.ms-excel | application/vnd.ms-excel | |
| 21 | ppt | application/vnd.ms-powerpoint | application/vnd.ms-powerpoint | |
| 22 | application/pdf | application/pdf | ||
| 23 | chm | application/octet-stream | application/octet-stream | 其他 |
| 24 | mdb | application/msaccess | application/x-msaccess | 資料庫 |
| 25 | sql | application/octet-stream | text/plain | 腳本/資料 |
| 26 | con | application/octet-stream | application/octet-stream | 系統/日誌 |
| 27 | log | text/plain | text/plain | |
| 28 | dat | application/octet-stream | text/plain | |
| 29 | ini | application/octet-stream | application/octet-stream | |
| 30 | php | application/octet-stream | application/octet-stream | 程式碼 |
| 31 | html / htm | text/html | text/html | 網頁 |
| 32 | xml | text/xml | text/xml | |
| 33 | ttf | application/octet-stream | application/octet-stream | 字型 |
| 34 | fon | application/octet-stream | application/octet-stream | |
| 35 | js | application/x-javascript | text/html | 腳本 |
| 36 | dll | application/octet-stream | application/x-msdownload | 程式庫 |
| 37 | class | application/octet-stream | application/java-vm | Java 類別 |
以下為更完整的副檔名對應表,可直接用於 mime_content_type() 或自定義白名單:
.ai application/postscript
.asf video/x-ms-asf
.avi video/x-msvideo
.css text/css
.csv text/csv
.docx application/vnd.openxmlformats-officedocument.wordprocessingml.document
.eot application/vnd.ms-fontobject
.eps application/postscript
.gif image/gif
.gz application/gzip
.htm text/html
.html text/html
.ico image/x-icon
.jpg image/jpeg
.jpeg image/jpeg
.js application/javascript
.json application/json
.mp3 audio/mpeg
.mp4 video/mp4
.otf font/otf
.pdf application/pdf
.png image/png
.pptx application/vnd.openxmlformats-officedocument.presentationml.presentation
.rar application/vnd.rar
.svg image/svg+xml
.tar application/x-tar
.tif image/tiff
.tiff image/tiff
.ttf font/ttf
.txt text/plain
.woff font/woff
.woff2 font/woff2
.xlsx application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
.xml application/xml
.zip application/zip
finfo 擴展:透過 finfo_file() 讀取檔案真實 MIME,避免瀏覽器誤報或偽造。php_flag engine off 或 Nginx/Apache 禁止解析)。upload_max_filesize、post_max_size 並前端二次檢查。<?php
$allowedMimes = [
'image/gif', 'image/jpeg', 'image/pjpeg', 'image/png', 'image/x-png',
'application/pdf', 'application/zip', 'application/x-zip-compressed',
'text/plain', 'text/csv',
];
$allowedExt = ['gif','jpg','jpeg','png','pdf','zip','txt','csv'];
$finfo = new finfo(FILEINFO_MIME_TYPE);
$mime = $finfo->file($_FILES['file']['tmp_name']);
$ext = strtolower(pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION));
if (!in_array($mime, $allowedMimes, true) || !in_array($ext, $allowedExt, true)) {
die('檔案類型不允許上傳');
}
// 後續移動、重命名、入庫...
?>
掌握各瀏覽器 MIME 差異、善用 finfo 驗證真實檔案類型、配合副檔名白名單與安全儲存策略,才能建立健壯的 PHP 檔案上傳功能。本表可作為專案白名單的基礎參考,建議根據實際業務需求裁剪擴充。