如何在servlet上设置内容类型

时间:2011-03-07 05:30:25

标签: java servlets

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

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

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

2 个答案:

答案 0 :(得分:12)

  

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

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

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

servletcontainer通常已在其自己的web.xml中提供默认的mime类型映射。如果要覆盖或添加其他内容,请将其作为新的mime映射放在webapp的web.xml中。 E.g。

<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.

答案 1 :(得分:8)

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

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

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

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

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

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