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