[英]Serve dynamically changing static content with Spring Boot
現在我有一個簡單的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}
上提供的localhost:8080/img/{image name}
。 如果可能的話,我希望能夠在應用程序運行時向該文件夾添加內容,並讓Spring自動為它們提供服務而無需重新啟動它。
有沒有人有任何想法? 提前致謝。
您的方法的問題是您在運行Spring啟動應用程序並且未初始化常量IMAGE_DIR
並且為null
設置IMAGE_DIR
。 更改如下:
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的選擇是個人的,你可以選擇你想要的。 注意,您的應用程序需要具有創建符號鏈接的良好權利。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.