2013-01-23 78 views
2

你好我想創建一個應用程序,允許我主持任何類型的文件。 爲了做它我exececuting以下魔法:使用ResponseBody彈簧文件下載

@RequestMapping(value = "/files/{file_name}", method = RequestMethod.GET) 
    @ResponseBody 
    public FileSystemResource 
    getFile(
      @PathVariable("file_name") String fileName) { 
     System.out.println(fileName); 
     String filePath = "./files/"; 
     return new FileSystemResource(new File(filePath+fileName)); 
    } 

但是,這種方法帶來了不必要的3個問題:

  1. 一些隨機數據beeing附加到文件

  2. 的文件被打開在瀏覽器窗口而不是beeing 下載 - 我試圖破解這個使用類似

    produce =「application/octet-stream」

    但它只導致406錯誤。

  3. test.txt是beeing截斷測試,我發現一個walkaround提供與test.txt /作爲fileName的應用程序,但它看起來有點混亂。

回答

1

spring manual

與@RequestBody指出,春季通過使用HttpMessageConverter返回的對象到 響應主體轉換

我覺得你的問題是沒有按春」用HttpMessageConverter來處理FileSystemResource。

A list of builtin HttpMessageConverter is available here。我建議你嘗試以某種方式將你的反應成字節數組,也許它會挑ByteArrayHttpMessageConverter代替您解決問題

0

我用這樣的代碼返回圖像

@RequestMapping(value = "/image/{id}", method = RequestMethod.GET) 
public String getImage(... HttpServletResponse response) { 
     response.setContentType(image/png); 
     (response.getOutputStream()).write(imageByteArray); 
} 

我認爲你必須定義適當的MIME鍵入並將您的數據發送給回覆。