【问题标题】:How to set the content type on the servlet如何在 servlet 上设置内容类型
【发布时间】:2011-03-07 05:30:24
【问题描述】:

我正在使用一个简单的 servlet,它将数据库中的文档内容作为字节数组发送回。我想设置一个内容type,以便在通过 doGet() 调用检索它时具有适当的扩展名。

我确实将文档的类型作为元数据存储在数据库中(例如 png、gif、png、xls、docx ...)。

  1. 我应该将什么设置为内容类型以使其保留文件扩展名?
  2. 下载的文件名为“doc”,如何在 servlet 上为正在下载的数据设置文件名。

【问题讨论】:

标签: java servlets


【解决方案1】:

我应该将什么设置为内容类型以使其保留文件扩展名?

使用ServletContext#getMimeType()根据文件名获取mime类型。

String mimeType = getServletContext().getMimeType(filename);

servletcontainer 通常已经在它自己的web.xml 中提供了一个默认的mime 类型映射。如果您想覆盖或添加其他内容,请将其作为新的 mime 映射放在 webapp 的 web.xml 中。例如

<mime-mapping>
    <extension>docx</extension>
    <mime-type>application/vnd.openxmlformats-officedocument.wordprocessingml.document</mime-type>
</mime-mapping>
<mime-mapping>
    <extension>xlsx</extension>
    <mime-type>application/vnd.openxmlformats-officedocument.spreadsheetml.sheet</mime-type>
</mime-mapping>

最后设置为Content-Type响应头:

response.setContentType(mimeType);

下载的文件名为“doc”,如何在 servlet 上为正在下载的数据设置文件名。

将其添加到 servlet URL,因为 MSIE 等某些浏览器会忽略内容处置的 filename 属性。

<a href="download/filename.ext">download filename.ext</a>

如果servlet映射到/download/*的URL模式上,则可以通过如下方式获取

String filename = request.getPathInfo().substring(1);

最后也将其设置在Content-Disposition 标头中,以使普通浏览器满意:

response.setHeader("Content-Disposition", "attachment; filename=\"" + filename + "\"");

如果您不将文件名存储在 DB 中而是存储 ID 或其他内容,则将其用作文件名。

<a href="download/${file.id}.${file.ext}">download ${file.id}.${file.ext}</a>

然后在servlet中

String filename = request.getPathInfo().substring(1);
String id = filename.split("\\.")[0];
// Obtain from DB based on id.

【讨论】:

    【解决方案2】:
    1. 我应该将什么设置为内容类型以便它保留文件 扩展?

    您可以使用响应对象的 setContentType 方法来设置 mime。例如:

    response.setContentType("your-correct-mime-here");
    

    2.下载的文件名为“doc”,如何设置 servlet 上用于数据的文件名 正在下载

    您可以通过设置正确的标题来设置正在下载的文件的文件名。您可以使用如下所示的 Content-Disposition:

    response.setHeader("Content-Disposition", "attachment; filename=\"" + your_file_name + "\"");
    

    【讨论】:

    • 注意“你的文件名”有一些问题。 1) 不是一个有效的变量名。 2) 引用有用:filename=\"" + filename + "\"".
    • @Dave,感谢您指出错误。 “你的文件名”不是一个变量...我让人们更容易阅读并通过过度简化它犯了一个错误!
    猜你喜欢
    • 2010-12-29
    • 2012-03-27
    • 2016-09-28
    • 2012-02-07
    • 2014-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多