如何在servlet上设置内容类型

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

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

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

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

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

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

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

  docx application/vnd.openxmlformats-officedocument.wordprocessingml.document   xlsx application/vnd.openxmlformats-officedocument.spreadsheetml.sheet  

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

 response.setContentType(mimeType); 

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

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

 download filename.ext 

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

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

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

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

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

 download ${file.id}.${file.ext} 

然后在servlet中

 String filename = request.getPathInfo().substring(1); String id = filename.split("\\.")[0]; // Obtain from DB based on id. 
  1. 我应该将什么设置为内容类型以便保留文件扩展名?

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

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

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

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

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