什么时候浏览器将application / octet-stream作为Content-Type发送?

时间:2010-03-11 16:32:36

标签: jsf file-upload content-type request-headers

我正在使用JSF开发文件上传。该应用程序保存有关该文件的三个日期:

  • 文件名
  • 字节
  • 浏览器提交的内容类型。

我的问题是某些文件以内容类型= application/octet-stream保存,即使它们是*.doc文件或*.pdf

浏览器何时提交此类内容类型?
我想清理数据库,所以我需要知道浏览器信息何时不正确。

2 个答案:

答案 0 :(得分:8)

忽略浏览器发送的值。这确实取决于客户端平台,浏览器和使用的配置。

如果您希望根据文件扩展名完全控制内容类型,请使用ServletContext#getMimeType()更好地自行确定。

String mimeType = servletContext.getMimeType(filename);

默认的mime类型在相关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();

请注意,它不支持所有 mimetypes可靠。您也可以考虑两种方法的组合。例如。如果一个返回null或application/octet-stream,则使用另一个。或者,如果两者都返回不同但“有效”的mimetype,则更喜欢JMimeMagic返回的mimetype。

哦,我几乎忘了添加,在JSF中你可以获得ServletContext如下:

ServletContext servletContext = (ServletContext) FacesContext.getCurrentInstance().getExternalContext().getContext();

或者如果您恰好使用JSF 2.x,请改用ExternalContext#getMimeType()

答案 1 :(得分:2)

这取决于操作系统,浏览器以及用户如何配置它们。它基于浏览器确定本地文件的文件类型(显示它们)的方式。在大多数OS /浏览器组合中,这是基于文件的扩展名,但在某些情况下,可以通过其他方式确定。 (例如:在Mac OS上)

在某种情况下,您不应该真正依赖浏览器发送的内容类型。最好的方法是实际查看文件的内容。您可能也可以使用文件名,但请记住,浏览器不一定能告诉您(尽管它可能仍然是 lot 比它们发送的Content-type更可靠) )。