【问题标题】:Spring Boot images uploading and servingSpring Boot 镜像上传和服务
【发布时间】:2018-01-20 21:51:55
【问题描述】:

我正在制作新的 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

我应该怎么做才能让它发挥作用?

【问题讨论】:

    标签: spring image spring-boot file-upload static-content


    【解决方案1】:

    要从您的images folder 访问图像,

    您需要像这样覆盖WebMvcConfigurerAdapter 类的addResourceHandlers 方法:

    @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}}"/>
    

    【讨论】:

    • 感谢您的回答
    【解决方案2】:

    您可以将外部文件存储在与您的 jar 相同的目录中名为 /static 的文件夹中,spring 将默认扫描它们。所以如果你有static/images/,你可以参考你的图片:

    &lt;img th:src="@{/images/img.ext}"/&gt;

    所以你会想使用new File("/static/images/" + imgName);

    【讨论】:

      【解决方案3】:

      默认情况下,您的 Spring Boot 应用程序提供 static content - 在您的情况下为图像 - 位于以下位置:

      • /静态
      • /公共
      • /资源
      • /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/");
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-09-09
        • 2019-05-09
        • 1970-01-01
        • 1970-01-01
        • 2018-06-09
        • 2017-09-18
        • 2022-01-15
        • 1970-01-01
        相关资源
        最近更新 更多