如何在servlet上设置内容类型

use*_*108 9 java servlets

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

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

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

Bal*_*usC 12

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

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

String mimeType = getServletContext().getMimeType(filename);
Run Code Online (Sandbox Code Playgroud)

servletcontainer通常已经提供了自己的默认mime类型映射web.xml.如果你想覆盖或添加其他一些,那么把它作为新的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>
Run Code Online (Sandbox Code Playgroud)

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

response.setContentType(mimeType);
Run Code Online (Sandbox Code Playgroud)

下载的文件名为"doc",如何在servlet上设置要下载的数据的文件名.

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

<a href="download/filename.ext">download filename.ext</a>
Run Code Online (Sandbox Code Playgroud)

如果servlet映射到URL模式/download/*,那么您可以按如下方式获取它

String filename = request.getPathInfo().substring(1);
Run Code Online (Sandbox Code Playgroud)

最后将它设置在Content-Disposition标题中以使普通浏览器感到高兴:

response.setHeader("Content-Disposition", "attachment; filename=\"" + filename + "\"");
Run Code Online (Sandbox Code Playgroud)

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

<a href="download/${file.id}.${file.ext}">download ${file.id}.${file.ext}</a>
Run Code Online (Sandbox Code Playgroud)

然后在servlet中

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


Abd*_*oof 8

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

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

response.setContentType("your-correct-mime-here");
Run Code Online (Sandbox Code Playgroud)

2.文件下载名称为"doc",如何在servlet上设置要下载的数据的文件名

您可以通过设置正确的标头来设置要下载的文件的文件名.您可以使用Content-Disposition,如下所示:

response.setHeader("Content-Disposition", "attachment; filename=\"" + your_file_name + "\"");
Run Code Online (Sandbox Code Playgroud)