Spring 3 MVC - 浏览器认为我的下载是.htm文件

时间:2013-02-05 21:47:22

标签: java spring-mvc download spring-3

我在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”结尾的网址,浏览器正在查看该内容?

1 个答案:

答案 0 :(得分:0)

你正在混合两种产生反应的风格。直接写入响应,并要求Spring将方法的返回值写入响应主体。你应该坚持使用一个,就像你现在一样,框架会覆盖响应内容类型。通常,您可以将响应的内容类型称为produces注释的属性@RequestMapping。但是,因为在这种情况下你还想编写内容处理标题,我建议使用自定义视图,而不是@ResponseBody注释。

在自定义视图类中,设置所需的标头,然后自己将字节流式传输到响应输出流。

希望这有帮助。