我正在使用JSF开发文件上传。该应用程序将保存有关文件的三个日期:
我的问题是,即使某些文件是
application/octet-stream
文件或odt *.doc
,也保存了某些内容类型为*.pdf
的文件。浏览器什么时候提交这样的内容类型?
我想清理数据库,所以我需要知道浏览器信息何时不正确。
最佳答案
忽略浏览器发送的值。这确实取决于客户端平台,使用的浏览器和配置。
如果要基于文件扩展名完全控制内容类型,则最好使用 ServletContext#getMimeType()
自己确定。
String mimeType = servletContext.getMimeType(filename);
默认的mime类型在所讨论的servlet容器的
web.xml
中定义。例如在Tomcat中,它位于/conf/web.xml
中。您可以按以下步骤在网络应用的/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
,则使用另一个。或者,如果两者都返回不同但“有效”的模仿类型,则最好使用JMimeMagic返回的模仿类型。哦,我差点忘了补充,在JSF中,您可以按以下方式获取
ServletContext
:ServletContext servletContext = (ServletContext) FacesContext.getCurrentInstance().getExternalContext().getContext();
或者,如果您碰巧已经使用过JSF 2.x,请改用
ExternalContext#getMimeType()
。
关于jsf - 浏览器何时将应用程序/八位字节流发送为“内容类型”?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2426773/