我正在制作新的 Spring Boot 应用程序并希望能够存储和提供图像,我希望将图像存储在应用程序目录中:
这是现在上传的样子:
@PostMapping("/")
@ResponseBody
public String upload(@RequestPart String title, @RequestPart MultipartFile img) throws IOException{
String imgName = img.getOriginalFilename();
Post p = new Post();
p.setTitle(title);
p.setImageName(imgName);
postService.add(p);
File upl = new File("images/" + imgName);
upl.createNewFile();
FileOutputStream fout = new FileOutputStream(upl);
fout.write(img.getBytes());
fout.close();
return "ok";
}
这就是我想要获取图像的方式
<img th:src="@{'images/' + ${post.imageName}}"/>
现在我得到 404,当我想查看目录中的一些图像时,我得到
Fatal error reading PNG image file: Not a PNG file
我应该怎么做才能让它工作?
原文由 Weras Adve 发布,翻译遵循 CC BY-SA 4.0 许可协议
默认情况下,您的 Spring Boot 应用程序提供 静态 内容- 在您的情况下为图像 - 在以下位置找到:
因此,通常情况下,
static/images/
可能是 Thymeleaf 应该期待必须交付渲染的 静态 图像的地方。但是因为这个地方是关于 静态 内容的,而且因为在你的应用程序中保存上传的(动态)内容通常是一个坏主意,我建议 不要这样做。您是否考虑过如果您的应用程序被重新部署或移动到另一台机器上会发生什么?您将不得不以繁琐的方式备份/移动图像。有更好的解决方案,将上传内容存储在应用程序外部的单独位置(例如,可以配置,也可以由多个实例重用),甚至使用数据库来存储图像数据。这也将允许在事务上下文中处理图像(例如隔离和回滚)。但是,如果您现在仍想将其存储在您的应用程序中,您可以通过添加要搜索的位置(实际上是 静态 内容)来扩展位置。尽管 Ajit 的答案甚至文档仍然给出了扩展您自己的
WebMvcConfigurerAdapter
的建议,但我个人倾向于实施 WebMvcConfigurer ,因为前者已被弃用。在这种情况下,它应该如下所示: