gpt4 book ai didi

Spring Boot 镜像上传和服务

转载 作者:行者123 更新时间:2023-12-04 04:54:40 24 4
gpt4 key购买 nike

我正在制作新的 Spring Boot 应用程序并希望能够存储和提供图像,我希望图像存储在应用程序目录中:
enter image description here

这是现在上传的样子:

@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 应该期望必须交付用于渲染的静态图像的地方。但是由于这个地方是关于静态内容的,并且由于在您的应用程序中保存上传的(动态)内容通常是一个坏主意,我建议 不要那样做 .你有没有想过如果你的应用程序被重新部署或移动到另一台机器上会发生什么?您将不得不以繁琐的方式备份/移动图像。有更好的解决方案,将上传内容存储在您的应用程序之外的单独位置(例如,可以配置并由多个实例重用),甚至使用数据库来存储图像数据。这也将能够在事务上下文中处理图像(例如隔离和回滚)。

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

    在这种情况下,它应该如下所示:
    @Configuration
    public class AdditionalResourceWebConfiguration implements WebMvcConfigurer {
    @Override
    public void addResourceHandlers(final ResourceHandlerRegistry registry) {
    registry.addResourceHandler("/images/**").addResourceLocations("file:images/");
    }
    }

    关于Spring Boot 镜像上传和服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45651119/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com