2017-08-12 84 views
2

我在做新的Spring引导应用程序,并希望能够存储并提供图片,我想的图像将被存储在应用程序目录显示 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 

我应该怎么做才能使它工作?

回答

4

默认情况下,您的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/"); 
    } 
} 
+0

谢谢:d –

+0

欢迎您:) –

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}}"/> 
+0

感谢您的解决了这个问题的答案 –