我正在用JSF開發文件上傳。該應用程序保存有關文件的三個日期:瀏覽器何時將應用程序/八位字節流作爲Content-Type發送?
- 文件名作爲提交瀏覽器
- 字節
- 內容類型。
我的問題是,一些文件的保存與內容類型= application/octet-stream
即使他們*.doc
文件奧德*.pdf
。
什麼時候瀏覽器提交這樣的內容類型?
我想清理數據庫,所以我需要知道瀏覽器信息何時不正確。
我正在用JSF開發文件上傳。該應用程序保存有關文件的三個日期:瀏覽器何時將應用程序/八位字節流作爲Content-Type發送?
我的問題是,一些文件的保存與內容類型= application/octet-stream
即使他們*.doc
文件奧德*.pdf
。
什麼時候瀏覽器提交這樣的內容類型?
我想清理數據庫,所以我需要知道瀏覽器信息何時不正確。
忽略由瀏覽器發送的值。這確實取決於所使用的客戶端平臺,瀏覽器和配置。
如果要對基於文件擴展名的內容類型的完全控制,然後利用好自己ServletContext#getMimeType()
確定它。
String mimeType = servletContext.getMimeType(filename);
默認的MIME類型definied在有關servletcontainer的web.xml
。例如Tomcat,它位於/conf/web.xml
。您可以擴展/在webapp的/WEB-INF/web.xml
覆蓋它如下:
<mime-mapping>
<extension>xlsx</extension>
<mime-type>application/vnd.openxmlformats-officedocument.spreadsheetml.sheet</mime-type>
</mime-mapping>
您也可以基於實際的文件內容的MIME類型(因爲文件擴展名可能本身並不準確,它可以通過被愚弄客戶),但這是很多工作。考慮使用第三方庫來完成所有的工作。我發現JMimeMagic對此很有用。
String mimeType = Magic.getMagicMatch(file, false).getMimeType();
需要注意的是它不支持所有 MIME類型爲可靠:您可以按如下方式使用它。你也可以考慮兩種方法的組合。例如。如果一個返回null或application/octet-stream
,則使用另一個。或者,如果兩者都返回不同但「有效」的mimetype,則首選JMimeMagic返回的。
哦,我差點忘了補充,在JSF可以獲取ServletContext
如下:
ServletContext servletContext = (ServletContext) FacesContext.getCurrentInstance().getExternalContext().getContext();
或者,如果你碰巧已經使用JSF 2.x中,使用ExternalContext#getMimeType()
來代替。
這取決於操作系統,瀏覽器,以及用戶如何配置它們。它基於瀏覽器確定本地文件的文件類型(顯示它們)的方式。在大多數操作系統/瀏覽器組合中,這是基於文件的擴展名,但有些可能由其他方式決定。 (例如:在Mac OS)
在AY情況下,你真的不應該依賴於瀏覽器發送的內容類型。最好的方法是實際查看文件的內容。你很可能還使用文件名,但請記住,瀏覽器並不一定會成爲良好告訴你,要麼(雖然它可能仍然是一個很多比它們發送的內容類型更可靠)。
嗯...我不能讓Firefox使用一個不好的MIME類型,即使我弄亂了我的系統mime.types文件,所以我不確定瀏覽器可能會通過一個Content-type頭來做什麼。 – Pointy 2010-03-11 16:46:21
@Pointy:不幸的是,世界上有更多的瀏覽器只有FF。例如由Redmond的(咳嗽)團隊開發的。 – BalusC 2010-03-11 16:56:24
當然是的 - 奇怪的是,我期望IE獲得MIME類型錯誤,但不是那樣。 (例如,我希望它爲一個名稱碰巧是「bogus.pdf」的JPEG文件提供「application/pdf」。) – Pointy 2010-03-11 17:01:08