Spring 引导映像上传和服务
Spring Boot images uploading and serving
我正在制作新的 Spring 启动应用程序并希望能够存储和提供图像,我希望将图像存储在应用程序目录中:
这是目前正在上传的样子:
@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
我应该怎么做才能让它发挥作用?
要从您的 images folder
、
访问图片
您需要重写 WebMvcConfigurerAdapter
class 的 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}}"/>
默认情况下,您的 Spring 引导应用程序服务 static content - 在您的情况下图像 - 在以下位置找到:
- /静态
- /public
- /资源
- /META-INF/resources
所以通常,static/images/
可能是 Thymeleaf 应该期待 static 图像的地方,这些图像必须交付渲染。但是由于这个地方是关于 static 内容的,并且由于将上传的(动态)内容保存在您的应用程序中通常不是一个好主意,我建议 不要这样做那。您是否考虑过如果您的应用程序被重新部署或移动到另一台机器会发生什么?您将不得不以一种麻烦的方式备份/移动图像。有更好的解决方案,将上传内容存储在应用程序外部的单独位置(例如,可以配置并由多个实例重复使用),甚至使用数据库来存储图像数据。这也将能够在事务上下文中处理图像(例如隔离和回滚)。
但是如果您现在仍想将其存储在您的应用程序中,您可以通过添加要搜索的位置(实际上是 static 内容)来扩展位置。尽管 Ajit 的答案甚至文档仍然给出扩展您自己的 WebMvcConfigurerAdapter
的建议,但我个人倾向于实施 WebMvcConfigurer,因为前者已被弃用。
在这种情况下,它应该如下所示:
@Configuration
public class AdditionalResourceWebConfiguration implements WebMvcConfigurer {
@Override
public void addResourceHandlers(final ResourceHandlerRegistry registry) {
registry.addResourceHandler("/images/**").addResourceLocations("file:images/");
}
}
您可以将外部文件存储在名为 /static
的文件夹中,该文件夹与您的 jar 位于同一目录中,默认情况下 spring 将扫描它们。因此,如果您有 static/images/
,您可以通过以下方式引用您的图像:
<img th:src="@{/images/img.ext}"/>
所以你会想要使用 new File("/static/images/" + imgName);
我正在制作新的 Spring 启动应用程序并希望能够存储和提供图像,我希望将图像存储在应用程序目录中:
这是目前正在上传的样子:
@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
我应该怎么做才能让它发挥作用?
要从您的 images folder
、
您需要重写 WebMvcConfigurerAdapter
class 的 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}}"/>
默认情况下,您的 Spring 引导应用程序服务 static content - 在您的情况下图像 - 在以下位置找到:
- /静态
- /public
- /资源
- /META-INF/resources
所以通常,static/images/
可能是 Thymeleaf 应该期待 static 图像的地方,这些图像必须交付渲染。但是由于这个地方是关于 static 内容的,并且由于将上传的(动态)内容保存在您的应用程序中通常不是一个好主意,我建议 不要这样做那。您是否考虑过如果您的应用程序被重新部署或移动到另一台机器会发生什么?您将不得不以一种麻烦的方式备份/移动图像。有更好的解决方案,将上传内容存储在应用程序外部的单独位置(例如,可以配置并由多个实例重复使用),甚至使用数据库来存储图像数据。这也将能够在事务上下文中处理图像(例如隔离和回滚)。
但是如果您现在仍想将其存储在您的应用程序中,您可以通过添加要搜索的位置(实际上是 static 内容)来扩展位置。尽管 Ajit 的答案甚至文档仍然给出扩展您自己的 WebMvcConfigurerAdapter
的建议,但我个人倾向于实施 WebMvcConfigurer,因为前者已被弃用。
在这种情况下,它应该如下所示:
@Configuration
public class AdditionalResourceWebConfiguration implements WebMvcConfigurer {
@Override
public void addResourceHandlers(final ResourceHandlerRegistry registry) {
registry.addResourceHandler("/images/**").addResourceLocations("file:images/");
}
}
您可以将外部文件存储在名为 /static
的文件夹中,该文件夹与您的 jar 位于同一目录中,默认情况下 spring 将扫描它们。因此,如果您有 static/images/
,您可以通过以下方式引用您的图像:
<img th:src="@{/images/img.ext}"/>
所以你会想要使用 new File("/static/images/" + imgName);