我有一个使用Spring Framework 3构建的系统,现在我必须实现文件下载。 要执行“donwload动作”,我通常会得到HttpServletReponse对象,设置标题并从中获取用户输出流。哪一个是在Spring MVC上制作下载控制器的最佳方式?
它运行良好,但我想知道是否有更简单/更智能的方法来做到这一点?
非常感谢!
我有一个使用Spring Framework 3构建的系统,现在我必须实现文件下载。 要执行“donwload动作”,我通常会得到HttpServletReponse对象,设置标题并从中获取用户输出流。哪一个是在Spring MVC上制作下载控制器的最佳方式?
它运行良好,但我想知道是否有更简单/更智能的方法来做到这一点?
非常感谢!
您可以使用@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;
}
我发现使用@RepsonseBody注解强制内容类型是ServletRequest .. so response.setContentType()之一。不工作.. – gipinani 2013-06-26 11:28:16
使用弹簧mvc,您可以通过OutputStream
和HttpEntity
作为参数,但将HttpServletResponse
传递给控制器方法是非常好的方法。
您可以使用@ResponseBody或从您的控制器方法返回一个HttpEntity。详细信息请参见http://static.springsource.org/spring/docs/3.0.x/reference/mvc.html#mvc-ann-responsebody。
还有其他的方式,但他们来自建筑师/设计师的观点或健全的软件工程原则的观点,这可能会或可能不会更容易/更聪明。如果你问一个设计师,他可能会说控制器不应该知道数据的下载(模型)。有些人甚至建议不要在控制器中使用HttpServletReponse,有些人会建议扩展AbstractView(或选择合适的子类),以便可以在响应主体中重复使用或刷新流,以便从控制器中分离视图。
也许还有其他的方法,但我的建议是保持简单并实现团队中的任何作品—,尽管我会建议与设计师/建筑师(如果有)一起检查,以避免任何返工,因为他们可能有不同的视角。
听起来不错对我来说,唯一的选择将是一个隐藏的iframe你想让他们下载文件重定向,但我喜欢你做得好一点。 – Zoidberg 2011-02-28 13:22:51