2011-02-28 70 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(或選擇合適的子類),以便可以在響應主體中重複使用或刷新流,以便從控制器中分離視圖。

也許還有其他的方法,但我的建議是保持簡單並實現團隊中的任何作品—,儘管我會建議與設計師/建築師(如果有)一起檢查,以避免任何返工,因爲他們可能有不同的視角。

相關問題