Spring MVC上传文件,然后提供下载链接

时间:2015-09-12 16:32:55

标签: java spring-mvc tomcat

我在Tomcat上运行了Spring MVC Web应用程序。

我上传文件并将其保存在文件系统的/tmp文件夹中。

然后我需要在视图(Thymeleaf)中显示该文件的链接,以便用户可以通过单击链接下载该文件。怎么做?

我听说过配置Tomcat以允许特定的上下文链接到FS上的文件夹,但不知道如何做到这一点,或者这是否是唯一的解决方案。请帮忙。

2 个答案:

答案 0 :(得分: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进行文件上传。它取决于所使用的系统/应用程序,但通常临时目录,如名称所示,用于临时数据。通常保证临时目录中的数据将保持“合理的时间”,但应用程序必须考虑到临时目录的内容可以随时删除。

答案 1 :(得分:0)

这是对我有用的精确设置(Tomcat 8,SpringMVC,boot):

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

  2. 在控制器中:

  3. @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,但在数据库(source.setLogo())中,我指向server.xml中映射的图像

    我在这里发现了Tomcat配置:

      

    如果图像都位于webapp之外并且您想拥有   Tomcat的DefaultServlet来处理它们,那么你基本上都需要它们   在Tomcat中做的是添加以下Context元素   标记内的/conf/server.xml:

         

         

    这样他们就可以通过http://example.com/images/ ....

    访问了

    SO answer to a similar question