我在Tomcat上运行了Spring MVC Web应用程序。
我上传文件并将其保存在文件系统的/tmp
文件夹中。
然后我需要在视图(Thymeleaf)中显示该文件的链接,以便用户可以通过单击链接下载该文件。怎么做?
我听说过配置Tomcat以允许特定的上下文链接到FS上的文件夹,但不知道如何做到这一点,或者这是否是唯一的解决方案。请帮忙。
答案 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):
server.xml中:
<Context docBase="C:\tmp\" path="/images" />
在控制器中:
@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/ ....
访问了