其他分享
首页 > 其他分享> > Spring Boot图像上传和服务

Spring Boot图像上传和服务

作者:互联网

我正在制作新的Spring Boot应用程序并希望能够存储和提供图像,我希望将图像存储在应用程序目录中
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 /资源

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

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

在这种情况下,它应该看起来像:

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

标签:spring,spring-boot,file-upload,image,static-content
来源: https://codeday.me/bug/20191006/1862421.html