【问题标题】:Which is the best way to make a download controller on Spring MVC?在 Spring MVC 上制作下载控制器的最佳方法是什么?
【发布时间】:2011-02-28 13:19:31
【问题描述】:

我有一个使用 Spring Framework 3 构建的系统,现在我必须实现文件下载。 要执行“donwload 操作”,我通常会获取 HttpServletReponse 对象,设置标头并从中获取用户输出流。

效果很好,但我想知道是否有更简单/更智能的方法?

非常感谢!

【问题讨论】:

  • 对我来说听起来不错,唯一的其他选择是在隐藏的 iframe 中重定向到您希望他们下载的文件,但我喜欢您做得更好。

标签: spring-mvc download controller action


【解决方案1】:

您可以使用@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.. 所以 response.setContentType();不工作..
【解决方案2】:

您可以使用@ResponseBody 或从您的控制器方法返回一个HttpEntity。详情请见http://static.springsource.org/spring/docs/3.0.x/reference/mvc.html#mvc-ann-responsebody

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      还有其他方法,但它们是从架构师/设计师的角度或健全的软件工程原则的角度来看,这可能更容易/更智能,也可能不会。如果你问设计师,他可能会说控制器不应该知道数据(模型)的下载。有些人甚至可能建议不要在控制器中使用 HttpServletReponse,有些人会建议扩展 AbstractView(或选择它的合适子类),以便可以重用它或刷新响应体中的流以将视图与控制器分离。

      也许还有其他方法,但我的建议是保持简单并实施团队中的任何工作 - 尽管我建议与设计师/架构师(如果有的话)核实以避免任何返工,因为他们可能有不同的观点。

      【讨论】:

        猜你喜欢
        • 2011-12-17
        • 2010-11-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多