許多 PHP 上傳系統僅檢查常見 Office 格式(doc、docx、pdf),導致金山 WPS 專有格式 .wps 無法通過驗證。錯誤訊息通常為「檔案類型不符」,實際上是 MIME 類型陣列缺少對應項目。
| 副檔名 | 標準 MIME 類型 | 備註 |
|---|---|---|
| .doc | application/msword | Word 97-2003 |
| .docx | application/vnd.openxmlformats-officedocument.wordprocessingml.document | Word 2007+ |
| .wps | application/kswps | 金山 WPS 專用格式 |
| application/pdf | 通用文件格式 | |
| .et | application/kset | WPS 試算表 |
| .dps | application/ksdps | WPS 簡報 |
$uptypes = array(
'application/pdf',
'application/msword',
'application/vnd.ms-works', // 部分舊版 WPS 可能使用此類型
'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
'application/kswps', // 關鍵:新增 WPS 文字處理文件
'application/kset', // 可選:WPS 試算表
'application/ksdps' // 可選:WPS 簡報
);
// 檢查上傳檔案類型
if (!in_array($_FILES['file']['type'], $uptypes)) {
die('檔案類型不符! 僅可上傳 .doc .wps .docx .pdf 等格式');
}
僅檢查 $_FILES['file']['type'] 存在安全風險,因為:
pathinfo($filename, PATHINFO_EXTENSION)finfo_file() 檢測實際檔案內容// 更安全的驗證範例
$allowedExt = ['doc', 'docx', 'wps', 'pdf'];
$ext = strtolower(pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION));
if (!in_array($ext, $allowedExt)) {
die('副檔名不允許');
}
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$mime = finfo_file($finfo, $_FILES['file']['tmp_name']);
finfo_close($finfo);
$allowedMime = [
'application/msword',
'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
'application/kswps',
'application/pdf'
];
if (!in_array($mime, $allowedMime)) {
die('檔案內容類型不符: ' . $mime);
}
.wps 檔案對應的標準 MIME 類型為 application/kswps。單純新增此類型可解決基本上傳問題,但生產環境務必實施多層驗證,確保上傳安全性與相容性。