Spring Boot上传后加载图片

4

我能够将图片上传到服务器,并且可以在路径/static/images/gallery中找到我的图片。现在,当我尝试加载已上传的图片时,应用程序无法显示它们。只有在重新启动应用程序后才能正常显示。


请发布与显示图像相关的代码,并提供您遇到的错误详细信息;因为现在的问题对于任何人来说都太模糊了,无法提供帮助。 - Ken Y-N
3个回答

7

我也遇到了同样的问题!因为静态目录是在启动时加载的!你必须将上传路径放在资源之外! 假设这个项目名字叫做“Demo”,我认为你的目录应该像这样:

Demo
   src
     main
       java
       resources
         static
           images
             gallery

不要将上传目录放在资源文件夹中!可以按照以下方式操作:
@Configuration
public class AdditionalResourceWebConfiguration implements WebMvcConfigurer {

  @Override
  public void addResourceHandlers(final ResourceHandlerRegistry registry) {
    registry.addResourceHandler("/upload/**").addResourceLocations("file://" + System.getProperty("user.dir") + "/src/main/upload/");
  }
}

文件:你的固定路径!

现在你的目录就像这样:

    Demo
       src
         main
           java
           resources
             static
               images
                 gallery
           upload
             static
               images
                 gallery

好的!重新启动您的Spring Boot!尝试上传一些图片!您可以在http://localhost:80/upload/static/images/gallery/demo.jpg中看到这些图片。


请注意,在添加资源位置时,应使用file:///而不是file:// - Big Zed

2
只需考虑war、jar、ear——简而言之——部署的Java应用程序是存档文件,且存档文件在创建后不可更改。在我们的情况下,这意味着当您将任何资源保存在路径中时,它会加载到尚未构建(项目)的应用程序路径中...但是,您正在尝试获取资源的应用程序是已构建的存档文件,该文件尚不存在所请求的资源。重新启动应用程序后,将再次构建并创建新的存档文件,因此现在可以看到它;)。解决方案如前所述:
  1. 将资源保存在项目外,并
  2. 允许应用程序在此路径上具有读/写权限。
  3. 使用绝对路径。

2

静态目录在启动时加载。因此,当您上传图像或更改静态文件夹下的任何文件或文件夹时,这些更改将不会反映出来,因为ApplicationContext已经初始化。

若要上传动态图像,请按照以下步骤进行:

第一步:创建一个位于 Static 文件夹之外的目录,比如说我在服务器上创建了一个名为 media 的目录。

/var/www/html/myapp/media

步骤2: 在媒体目录中上传文件。

步骤3: 实现WebMvcConfigurer。

@Configuration
public class AdditionalResourceWebConfiguration implements WebMvcConfigurer {

  @Override
  public void addResourceHandlers(final ResourceHandlerRegistry registry) {
    registry.addResourceHandler("/media/**").addResourceLocations("file:media/");
  }
}

上传完成后,您可以动态访问文件http://localhost:8080/media/filename.jpg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接