我正在使用 JSF 开发文件上传。应用程序保存有关文件的三个日期:
- 文件名
- 字节
- 浏览器提交的 Content-Type。
我的问题是某些文件以 content type = 保存,application/octet-stream
即使它们是*.doc
文件 oder *.pdf
。
浏览器何时提交这样的内容类型?
我想清理数据库,所以我需要知道浏览器信息何时不正确。
我正在使用 JSF 开发文件上传。应用程序保存有关文件的三个日期:
我的问题是某些文件以 content type = 保存,application/octet-stream
即使它们是*.doc
文件 oder *.pdf
。
浏览器何时提交这样的内容类型?
我想清理数据库,所以我需要知道浏览器信息何时不正确。
忽略浏览器发送的值。这确实取决于所使用的客户端平台、浏览器和配置。
如果您想根据文件扩展名完全控制内容类型,那么最好自己使用ServletContext#getMimeType()
.
String mimeType = servletContext.getMimeType(filename);
默认的 mime 类型在相关web.xml
的 servletcontainer 中定义。例如在 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();
请注意,它并不支持所有可靠的 mimetype。您还可以考虑结合使用这两种方法。例如,如果一个返回 null 或application/octet-stream
,则使用另一个。或者,如果两者都返回不同但“有效”的 mimetype,则更喜欢 JMimeMagic 返回的那个。
哦,差点忘了补充,在JSF中可以获取ServletContext
如下:
ServletContext servletContext = (ServletContext) FacesContext.getCurrentInstance().getExternalContext().getContext();
或者,如果您碰巧已经使用 JSF 2.x,请ExternalContext#getMimeType()
改用。
这取决于操作系统、浏览器以及用户如何配置它们。它基于浏览器确定本地文件的文件类型(显示它们)的方式。在大多数操作系统/浏览器组合上,这是基于文件的扩展名,但在某些情况下,它可能通过其他方式确定。(例如:在 Mac OS 上)
在任何情况下,您都不应该真正依赖浏览器发送的 Content-type。最好的方法是实际查看文件的内容。您可能也可以使用文件名,但请记住,浏览器不一定会很好地告诉您(尽管它可能仍然比它们发送的 Content-type 可靠得多)。