2010-03-11 50 views
7

我正在用JSF開發文件上傳。該應用程序保存有關文件的三個日期:瀏覽器何時將應用程序/八位字節流作爲Content-Type發送?

  • 文件名作爲提交瀏覽器
  • 字節
  • 內容類型。

我的問題是,一些文件的保存與內容類型= application/octet-stream即使他們*.doc文件奧德*.pdf

什麼時候瀏覽器提交這樣的內容類型?
我想清理數據庫,所以我需要知道瀏覽器信息何時不正確。

+1

嗯...我不能讓Firefox使用一個不好的MIME類型,即使我弄亂了我的系統mime.types文件,所以我不確定瀏覽器可能會通過一個Content-type頭來做什麼。 – Pointy 2010-03-11 16:46:21

+0

@Pointy:不幸的是,世界上有更多的瀏覽器只有FF。例如由Redmond的(咳嗽)團隊開發的。 – BalusC 2010-03-11 16:56:24

+0

當然是的 - 奇怪的是,我期望IE獲得MIME類型錯誤,但不是那樣。 (例如,我希望它爲一個名稱碰巧是「bogus.pdf」的JPEG文件提供「application/pdf」。) – Pointy 2010-03-11 17:01:08

回答

8

忽略由瀏覽器發送的值。這確實取決於所使用的客戶端平臺,瀏覽器和配置。

如果要對基於文件擴展名的內容類型的完全控制,然後利用好自己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()來代替。

2

這取決於操作系統,瀏覽器,以及用戶如何配置它們。它基於瀏覽器確定本地文件的文件類型(顯示它們)的方式。在大多數操作系統/瀏覽器組合中,這是基於文件的擴展名,但有些可能由其他方式決定。 (例如:在Mac OS)

在AY情況下,你真的不應該依賴於瀏覽器發送的內容類型。最好的方法是實際查看文件的內容。你很可能還使用文件名,但請記住,瀏覽器並不一定會成爲良好告訴你,要麼(雖然它可能仍然是一個很多比它們發送的內容類型更可靠)。

相關問題