现在我有一个简单的Spring Boot应用程序,它提供我放在resources/static/img
中的静态图像。这适用于显示实际内容,但有两件事我想解决:
我不希望任何这些图像与生成的.jar
文件捆绑在一起,我知道将这些图像放在resources
文件夹中就可以了。
使用我当前的设置,为了在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自动为它们提供服务,而无需重新启动它。
有没有人有任何想法?提前谢谢。
答案 0 :(得分:2)
您的方法的问题是您在运行Spring启动应用程序后设置IMAGE_DIR
并且常量IMAGE_DIR
未初始化且为null
。改变如下:
public static void main(String[] args) throws IOException {
IMAGE_DIR = "/opt/img/";
SpringApplication.run(Application.class, args);
}
并删除所有File(".").getCanonicalPath()
相关内容,它会起作用。当您在所选目录中有新图像时,您的方法将满足您的需求。
答案 1 :(得分:0)
用你的观点解决问题2.
- 使用我当前的设置,为了在webapp上看到新图像,我必须将其添加到文件夹并重新启动它。我会喜欢 Spring用于提供特定文件夹中存在的任何静态内容, 所以我可以在应用程序运行时添加图像并拥有它们 自动在localhost上提供:8080 / img / {image name}。
醇>
您可以在以下位置创建所有这些图片:
/resources/public
-img
-js,...
并且只访问localhost:8080 / img / yourImage.png
“public”文件夹下的所有内容都可以访问
答案 2 :(得分:0)
为了通过Spring Boot动态提供内容,我找到了一个可行的解决方案。这个想法是将静态内容目录链接到没有缓存的符号链接 ,然后,您只需要在每次需要时重建符号链接。因此,在您的情况下:
@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));
符号链接/ tmp / images的选择是个人的,您可以选择所需的内容。请注意,您的应用程序需要具有正确的符号链接创建权限。