I'm making new Spring Boot app and want to be able to store and serve images, I want images to be stored in applications directory:
现在上传的样子是这样的:
@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
我应该怎么做才能让它发挥作用?
默认情况下,您的 Spring Boot 应用程序服务static content- 在您的情况下图像 - 在以下位置找到:
- /static
- /public
- /资源
- /META-INF/资源
所以通常情况下,static/images/
也许 Thymeleaf 应该期待的地方static必须交付用于渲染的图像。但由于这个地方大约static内容,因为在应用程序中保存上传的(动态)内容通常是一个坏主意,我建议不要那样做。您是否想过如果您的应用程序被重新部署或移动到另一台机器上会发生什么?您将不得不以繁琐的方式备份/移动图像。有更好的解决方案,将上传内容存储在应用程序外部的单独位置(例如,可以配置并且也可以由多个实例重用),甚至使用数据库来存储图像数据。这还可以在事务上下文中处理图像(例如隔离和回滚)。
但是,如果您现在仍想将其存储在应用程序中,则可以通过添加要搜索的位置来扩展位置(实际上static内容)。尽管 Ajit 的答案甚至文档仍然给出了扩展您自己的建议WebMvcConfigurerAdapter
,我个人倾向于实施WebMvc配置器相反,因为前者已被弃用。
在这种情况下,它应该看起来像:
@Configuration
public class AdditionalResourceWebConfiguration implements WebMvcConfigurer {
@Override
public void addResourceHandlers(final ResourceHandlerRegistry registry) {
registry.addResourceHandler("/images/**").addResourceLocations("file:images/");
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)