Какой лучший способ сделать контроллер загрузки на Spring MVC? - PullRequest
6 голосов
/ 28 февраля 2011

У меня есть система, созданная на основе Spring Framework 3, и теперь я должен осуществить загрузку файла. Чтобы выполнить «действие donwload», я обычно получаю объект HttpServletReponse, устанавливаю заголовки и получаю из него выходной поток пользователя.

Это хорошо работает, но я хотел бы знать, есть ли более простой / умный способ сделать это?

Большое спасибо!

Ответы [ 4 ]

8 голосов
/ 11 мая 2012

Вы можете использовать @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;
}
2 голосов
/ 28 февраля 2011

Вы можете использовать @ResponseBody или вернуть HttpEntity из вашего метода контроллера. Подробнее см. http://static.springsource.org/spring/docs/3.0.x/reference/mvc.html#mvc-ann-responsebody.

0 голосов
/ 28 февраля 2011

Есть и другие способы, но они с точки зрения архитектора / дизайнера или с точки зрения принципов разработки программного обеспечения, которые могут быть или не быть проще / умнее. Если вы спросите дизайнера, он может сказать, что контроллер не должен знать о загрузке данных (модели). Некоторые могут даже рекомендовать не использовать HttpServletReponse в контроллере, а некоторые рекомендуют расширить AbstractView (или выбрать подходящий его подкласс), чтобы его можно было повторно использовать, или сбросить поток в теле ответа, чтобы отделить представление от контроллера.

Возможно, есть и другие способы, но я рекомендую сделать это простым и реализовать все, что работает в команде - хотя я бы порекомендовал проконсультироваться с дизайнером / архитектором (если у вас есть), чтобы избежать каких-либо переделок, потому что они могут иметь другую точку зрения.

0 голосов
/ 28 февраля 2011

С пружинным mvc вы можете передать OutputStream и HttpEntity в качестве параметров, но передача HttpServletResponse в метод контроллера является идеальным подходом.

...