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

Posted

技术标签:

【中文标题】浏览器何时将 application/octet-stream 作为 Content-Type 发送?【英文标题】:When do browsers send application/octet-stream as Content-Type? 【发布时间】:2011-01-26 11:22:30 【问题描述】:

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

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

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

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

【问题讨论】:

嗯......即使我弄乱了我的系统 mime.types 文件,我也不能让 Firefox 使用错误的 MIME 类型,所以我不确定浏览器可能会做什么来传递内容类型标头。 @Pointy:不幸的是,世界上的浏览器不止FF。例如,由雷德蒙德的一个团队开发的(咳咳)。 是的,当然——奇怪的是,我希望 IE 得到错误的 MIME 类型,但不是那样。 (例如,我希望它为名称恰好是“bogus.pdf”的 JPEG 文件提供“application/pdf”。) 哦,在我最近熟悉的文件上传案例(我自己的应用程序)中,我没有注意这一点并使用服务器端嗅探器(在这种情况下为 Image Magick)确定文件类型。 How is mime type of an uploaded file determined by browser?的可能重复 【参考方案1】:

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

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

String mimeType = servletContext.getMimeType(filename);

默认的 mime 类型在相关 servlet 容器的 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类型(因为文件扩展名本身可能不准确,可能会被客户端欺骗),但这需要大量工作。考虑使用 3rd 方库来完成所有工作。我发现 JMimeMagic 对此很有用。您可以按如下方式使用它:

String mimeType = Magic.getMagicMatch(file, false).getMimeType();

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

哦,差点忘了补充,在JSF中你可以得到ServletContext,如下:

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

或者,如果您碰巧已经使用 JSF 2.x,请改用 ExternalContext#getMimeType()

【讨论】:

【参考方案2】:

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

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

【讨论】:

以上是关于浏览器何时将 application/octet-stream 作为 Content-Type 发送?的主要内容,如果未能解决你的问题,请参考以下文章

将 AWS S3 中所有文件的内容类型设置为 application/octet-stream

application/octet-stream和image/jpeg

关于火狐弹出下载application/octet-stream的问题

Android webview 上传图片为啥 application/octet-stream

如何将 RestTemplate 与 application/octet-stream 响应类型一起使用

为啥上传到 S3 的文件的内容类型为 application/octet-stream,除非我将文件命名为 .html?