使用Spring Boot动态更改静态内容

问题描述 投票:3回答:3

现在我有一个简单的Spring Boot应用程序,它提供我放在resources/static/img中的静态图像。这适用于显示实际内容,但有两件事我想解决:

  1. 我不希望任何这些图像与生成的.jar文件捆绑在一起,我知道将这些图像放在resources文件夹中就可以了。
  2. 使用我当前的设置,为了在webapp上看到新图像,我必须将其添加到该文件夹​​并重新启动它。我希望Spring能够提供特定文件夹中存在的任何静态内容,因此我可以在应用程序运行时添加图像并在localhost:8080/img/{image name}自动提供它们。

我试图通过设置资源处理程序来解决这个问题,但我不确定这是否与从resources/static简单地提供它们有什么不同。不幸的是,我仍然在努力正确配置,因为我根本无法看到任何图像。这是我试过的:

@Configuration
public class StaticResourceConfiguration extends WebMvcConfigurerAdapter {
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/img/**").addResourceLocations("file:" + Application.IMAGE_DIR);
        super.addResourceHandlers(registry);
    }
}

这是我的应用程序配置:

@SpringBootApplication
public class Application extends SpringBootServletInitializer {

    static String IMAGE_DIR;

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(Application.class);
    }

    public static void main(String[] args) throws IOException {
        SpringApplication.run(Application.class, args);
        IMAGE_DIR = new File(".").getCanonicalPath() + "/img/";
    }

}

同样,我的目标是在我的项目的根目录中设置一个名为img的文件夹,该文件夹将存储我希望webapp在localhost:8080/img/{image name}上提供的图像。如果可能的话,我希望能够在应用程序运行时向该文件夹添加内容,并让Spring自动为它们提供服务而无需重新启动它。

有没有人有任何想法?提前致谢。

java spring spring-mvc spring-boot
3个回答
2
投票

你的方法的问题是你在春季启动应用程序运行后设置IMAGE_DIR并且常量IMAGE_DIR未初始化并且是null。更改如下:

public static void main(String[] args) throws IOException {
        IMAGE_DIR = "/opt/img/";
        SpringApplication.run(Application.class, args);
    }

并删除所有File(".").getCanonicalPath()相关的东西,它会工作。当您在所选目录中有新图像时,您的方法将满足您的需求。


0
投票

用你的观点解决问题2。

  1. 使用我当前的设置,为了在webapp上看到新图像,我必须将其添加到该文件夹​​并重新启动它。我希望Spring能够提供特定文件夹中存在的任何静态内容,因此我可以在应用程序运行时添加图像并让它们自动在localhost:8080 / img / {image name}中提供。

您可以在以下位置创建所有图像:

/resources/public
    -img
    -js,...

并且只访问localhost:8080 / img / yourImage.png

“public”文件夹下的所有内容都可以访问


0
投票

为了通过spring boot动态提供内容,我找到了一个可行的解决方案。我们的想法是将静态内容目录链接到没有缓存的符号链接,之后,您只需要在每次需要时重建sym链接。所以在你的情况下:

@Configuration
public class StaticResourceConfiguration extends WebMvcConfigurerAdapter {
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/img/**").addResourceLocations("file:/tmp/images/").setCacheControl(CacheControl.noCache());
        super.addResourceHandlers(registry);
    }
}

之后,您可以像这样更改图像目录:

Path link = Paths.get("/tmp/images"); //Symlink
Files.deleteIfExists(link);
Files.createSymbolicLink(link, Paths.get(your_new_images_directory));

symlink / tmp / images的选择是个人的,你可以选择你想要的。注意,您的应用程序需要具有创建符号链接的良好权利。

© www.soinside.com 2019 - 2024. All rights reserved.