我在Spring 3框架webapp中实现了一个下载控制器,它应该在被调用时被调用以启动打开/保存对话框。
确实启动了“打开/保存”对话框,“保存”工作正常。当我单击打开时,它会将“.htm”附加到我的文件名并打开它。为什么呢?
控制器:
@RequestMapping("download/downloadFile")
@ResponseBody
public byte[] downloadFile(@RequestParam String fileID, HttpServletResponse response) {
response.setContentType("application/octet-stream");
File file = getFileByID(fileID);
byte[] bytes = FileCopyUtils.copyToByteArray(file);
response.setHeader("Content-Disposition", "attachment; filename=\"" + file.getName() + "\"");
response.setContentLength(bytes.length);
return bytes;
}
当我看到响应标题时,我看到内容类型是text / html,就像它忽略了我将它设置为application / octet-stream!
Cache-Control no-cache, no-store
Connection close
Content-Disposition attachment; filename="test.txt"
Content-Length 22071
Content-Type text/html
Date Tue, 05 Feb 2013 21:12:20 GMT
Expires Thu, 01 Jan 1970 00:00:00 GMT
Pragma no-cache
Server Apache/2.2.10 (Linux/SUSE)
X-Powered-By Servlet/2.5 JSP/2.1
X-UA-Compatible IE=8, chrome=1
是否可能是因为我在web.xml中设置Spring MVC的方式?
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>*.html</url-pattern>
</servlet-mapping>
哪里的所有内容都映射到以“.html”结尾的网址,浏览器正在查看该内容?
答案 0 :(得分:0)
你正在混合两种产生反应的风格。直接写入响应,并要求Spring将方法的返回值写入响应主体。你应该坚持使用一个,就像你现在一样,框架会覆盖响应内容类型。通常,您可以将响应的内容类型称为produces
注释的属性@RequestMapping
。但是,因为在这种情况下你还想编写内容处理标题,我建议使用自定义视图,而不是@ResponseBody
注释。
在自定义视图类中,设置所需的标头,然后自己将字节流式传输到响应输出流。
希望这有帮助。