2011-02-28 73 views
6

我有一个使用Spring Framework 3构建的系统,现在我必须实现文件下载。 要执行“donwload动作”,我通常会得到HttpServletReponse对象,设置标题并从中获取用户输出流。哪一个是在Spring MVC上制作下载控制器的最佳方式?

它运行良好,但我想知道是否有更简单/更智能的方法来做到这一点?

非常感谢!

+0

听起来不错对我来说,唯一的选择将是一个隐藏的iframe你想让他们下载文件重定向,但我喜欢你做得好一点。 – Zoidberg 2011-02-28 13:22:51

回答

8

您可以使用@ResponseBody,并返回一个byte[]

@RequestMapping("/getImage") 
@ResponseBody 
public byte[] getImage(HttpServletResponse response) throws IOException { 
    File imageFile = new File("image.jpg"); 
    byte[] bytes = org.springframework.util.FileCopyUtils.copyToByteArray(imageFile); 

    response.setHeader("Content-Disposition", "attachment; filename=\"" + imageFile.getName() + "\""); 
    response.setContentLength(bytes.length); 
    response.setContentType("image/jpeg"); 

    return bytes; 
} 
+0

我发现使用@RepsonseBody注解强制内容类型是ServletRequest .. so response.setContentType()之一。不工作.. – gipinani 2013-06-26 11:28:16

0

使用弹簧mvc,您可以通过OutputStreamHttpEntity作为参数,但将HttpServletResponse传递给控制器​​方法是非常好的方法。

0

还有其他的方式,但他们来自建筑师/设计师的观点或健全的软件工程原则的观点,这可能会或可能不会更容易/更聪明。如果你问一个设计师,他可能会说控制器不应该知道数据的下载(模型)。有些人甚至建议不要在控制器中使用HttpServletReponse,有些人会建议扩展AbstractView(或选择合适的子类),以便可以在响应主体中重复使用或刷新流,以便从控制器中分离视图。

也许还有其他的方法,但我的建议是保持简单并实现团队中的任何作品—,尽管我会建议与设计师/建筑师(如果有)一起检查,以避免任何返工,因为他们可能有不同的视角。

相关问题