2015-09-12 106 views
0

我有運行在Tomcat上的Spring MVC web應用程序。Spring MVC上傳文件,然後提供下載鏈接

我上傳文件並將其保存在文件系統的/tmp文件夾中。

然後我需要在視圖(Thymeleaf)中顯示該文件的鏈接,以便用戶可以通過單擊鏈接下載該文件。怎麼做?

我聽說過有關配置Tomcat以允許特定的上下文鏈接到FS上的文件夾,但不知道如何做,或者如果這是唯一的解決方案。請幫忙。

回答

0

這是精確設置爲我工作(Tomcat的8,用SpringMVC,引導):

  1. 的server.xml: <Context docBase="C:\tmp\" path="/images" />

  2. 在控制器:

@RequestMapping(value = "addNew", method = RequestMethod.POST) public String createNewsSource(@ModelAttribute("newsSource") NewsSource source, BindingResult result, Model model, @RequestParam("attachment") final MultipartFile attachment) { new NewsSourceValidator().validate(source, result); if (result.hasErrors()) { return "source/addNewSource"; } if (!attachment.isEmpty()) { try { byte[] bytes = attachment.getBytes(); BufferedOutputStream stream = new BufferedOutputStream( new FileOutputStream(new File("/tmp/" + attachment.getOriginalFilename()))); stream.write(bytes); stream.close(); } catch (Exception e) { e.printStackTrace(); } } source.setLogo("images/" + attachment.getOriginalFilename()); newsSourceService.createNewsSourceIfNotExist(source); return "redirect:/sources/list"; } 正如你所看到的,我將文件保存到/tmp,但在DB(source.setLogo()),我指着圖片爲server.xml

這裏映射在那裏我發現了大約Tomcat的配置:

如果圖像均位於Web應用程序之外,你想有 Tomcat的DefaultServlet到處理它們,那麼你基本上需要做 在Tomcat中到後續上下文元素添加到 /conf/server.xml內標籤:

這樣,他們就可以通過http://example.com/images/訪問....

SO answer to a similar question

1

我的做法,這是略有不同的方式。基本上,我使用兩個控制器操作來處理文件上傳,一個用於上傳和下載(查看)文件。

因此,上傳操作會將文件保存到文件系統上的某個預配置目錄,我假設您已經有該部分工作。

然後聲明類似下載操作這個

@Controller 
public class FileController { 
    @RequestMapping("/get-file/{filename}") 
    public void getFileAction(@RequestParam filename, HttpServletResponse response) { 
     // Here check if file with given name exists in preconfigured upload folder 
     // If it does, write it to response's output stream and set correct response headers 
     // If it doesn't return 404 status code 
    } 
} 

如果你想不可能僅僅通過了解名來下載文件,上傳文件後,保存到數據庫中的一些元信息(或任何其它存儲)併爲其分配一些散列(隨機ID)。然後,在getFileAction中,使用此散列來查找文件,而不是原始文件名。

最後,我會阻止使用/tmp進行文件上傳。它取決於所使用的系統/應用程序,但臨時數據一般都是臨時目錄,正如名稱所示。通常保證臨時目錄中的數據將保持「合理的時間」,但應用程序必須考慮到臨時目錄的內容可以隨時刪除。

+0

謝謝。所以基本上你的做法是有一個下載文件的行動。不錯的方法,但我認爲這是一個開銷。爲什麼不提供鏈接到文件。然而,Tomcat的上下文方法似乎也使用了Servlet - 「DefaultServlet」。我正在使用'/ tmp',僅用於測試目的。 – ACV

+1

我認爲,除非zou期待像Facebook這樣的流量,否則我認爲crating controller的開銷並不大。我使用這個,因爲我通常會在動作中做更多的檢查。 我想你可以使用上下文別名,如果你正在使用tomcat 7,但我沒有直接的經驗:http://www.we3geeks.org/2012/03/04/tomcat-directory-aliases/注意在tomcat 8中改變了用法:http://stackoverflow.com/questions/25909329/after-migrating-to-tomcat-8-aliases-doesnt-work-any-more – Kejml

+0

好的,這在Tomcat 8中適用於我'<上下文docBase =「C:\ tmp \」path =「/ images」/>' – ACV