jsf - 浏览器何时将应用程序/八位字节流发送为“内容类型”?

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

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

  • 文件名
  • 字节
  • 浏览器提交的
  • Content-Type。

  • 我的问题是,即使某些文件是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/

    相关文章:

    jsf - 在 EL 中调用直接方法或带参数/变量/参数的方法

    java - <h :messages> in JSF 页面上的错误消息

    GitHub 为明显非空的文件和文件夹提供 "This file is empty"

    Jquery BlueImp 如何在上传前更改文件名?

    .net - 使用 IHttpHandler 时,Firefox 无法正确处理内容类型

    jsf - 如何在复合组件内缓存数据?

    将 Spring bean 注入(inject) JSF Managed Beans

    javascript - 如何将文件上传与尚未创建的表单提交相关联?

    drupal - 按类别对内容进行分组 - Drupal

    azure - 更新缓存控制后,Blob 内容类型将被删除