我有一個使用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