Spring Boot 镜像上传和服务

新手上路,请多包涵

我正在制作新的 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 许可协议

阅读 433
2 个回答

默认情况下,您的 Spring Boot 应用程序提供 静态 内容- 在您的情况下为图像 - 在以下位置找到:

  • /静止的
  • /上市
  • /资源
  • /META-INF/资源

因此,通常情况下, static/images/ 可能是 Thymeleaf 应该期待必须交付渲染的 静态 图像的地方。但是因为这个地方是关于 静态 内容的,而且因为在你的应用程序中保存上传的(动态)内容通常是一个坏主意,我建议 不要这样做。您是否考虑过如果您的应用程序被重新部署或移动到另一台机器上会发生什么?您将不得不以繁琐的方式备份/移动图像。有更好的解决方案,将上传内容存储在应用程序外部的单独位置(例如,可以配置,也可以由多个实例重用),甚至使用数据库来存储图像数据。这也将允许在事务上下文中处理图像(例如隔离和回滚)。

但是,如果您现在仍想将其存储在您的应用程序中,您可以通过添加要搜索的位置(实际上是 静态 内容)来扩展位置。尽管 Ajit 的答案甚至文档仍然给出了扩展您自己的 WebMvcConfigurerAdapter 的建议,但我个人倾向于实施 WebMvcConfigurer ,因为前者已被弃用。

在这种情况下,它应该如下所示:

 @Configuration
public class AdditionalResourceWebConfiguration implements WebMvcConfigurer {
    @Override
    public void addResourceHandlers(final ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/images/**").addResourceLocations("file:images/");
    }
}

原文由 Kevin Peters 发布,翻译遵循 CC BY-SA 3.0 许可协议

要从您的 images folder 访问图像,

在此处输入图像描述

您需要覆盖 addResourceHandlers WebMvcConfigurerAdapter 类的方法,如下所示:

 @Configuration
public class ResourceConfig extends WebMvcConfigurerAdapter {
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/images/**").addResourceLocations("file:images/");
    }
}

之后,您需要在 URL 中的图像之前添加 / ,如下所示:

 <img th:src="@{'/images/' + ${post.imageName}}"/>

原文由 Ajit Soman 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题