我寫了一個上傳檔案的頁面,同一份檔案,同樣 Chrome(47.0.2526.106 m),在 Windows 8.1 下上傳上去的檔案
$_FILES['myFile']['type']
是很精準的,例如一份 Word 文檔,其值為
application/vnd.openxmlformats-officedocument.wordprocessingml.document
而在 Windows 7 上傳,得到的值卻是
application/octet-stream
。除了這個檔案,其他類型的檔案通過 Windows 8.1 上傳都是能夠精準識別的,而通過 Windows 7 上傳卻都是
application/octet-stream
,換瀏覽器也不行。
表單也設定了 enctype:
然後我在 PHP 官方手冊裡看到:
$_FILES['userfile']['type']
檔案的 MIME 類型,如果瀏覽器提供此資訊的話。一個例子是“image/gif”。不過此 MIME 類型在 PHP 端並不檢查,因此不要想當然認為有這個值。
既然是由瀏覽器提供此資訊
,那麼為什麼相同的瀏覽器在不同的系統下會有不同的表現?
P.S.我現在已經打算使用第三方庫去識別檔案的 MIME Types 了,但是我還是想瞭解為什麼會出現這個情況。
回複內容:
我寫了一個上傳檔案的頁面,同一份檔案,同樣 Chrome(47.0.2526.106 m),在 Windows 8.1 下上傳上去的檔案 $_FILES['myFile']['type']
是很精準的,例如一份 Word 文檔,其值為 application/vnd.openxmlformats-officedocument.wordprocessingml.document
而在 Windows 7 上傳,得到的值卻是 application/octet-stream
。除了這個檔案,其他類型的檔案通過 Windows 8.1 上傳都是能夠精準識別的,而通過 Windows 7 上傳卻都是 application/octet-stream
,換瀏覽器也不行。
表單也設定了 enctype:
然後我在 PHP 官方手冊裡看到:
$_FILES['userfile']['type']
檔案的 MIME 類型,如果瀏覽器提供此資訊的話。一個例子是“image/gif”。不過此 MIME 類型在 PHP 端並不檢查,因此不要想當然認為有這個值。
既然是由瀏覽器提供此資訊
,那麼為什麼相同的瀏覽器在不同的系統下會有不同的表現?
P.S.我現在已經打算使用第三方庫去識別檔案的 MIME Types 了,但是我還是想瞭解為什麼會出現這個情況。
這個參數完全依賴瀏覽器的識別,在有的作業系統或者檔案系統裡,有便捷的操作或者資訊去擷取到MIME類型,而在有的系統裡也許並不那麼容易,而瀏覽器有時候為了保證速度,也減少維護MIME識別的成本,就乾脆不分析具體的類型。也正是由於這個參數依賴用戶端的識別,所以這個參數並不總是可靠的,要得到可靠是MIME,還是需要自己去識別。
以上的回答是正確的,解決辦法是讀取檔案頭進行分析,你可以百度找一下檔案頭分析檔案類型,具體的我就不百度粘貼了。
因為不同的瀏覽器在處理的時候並不會完全輸出一樣的內容