簡體   English   中英

使用Spring Boot動態更改靜態內容

[英]Serve dynamically changing static content with Spring Boot

現在我有一個簡單的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}上提供的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。

  1. 使用我當前的設置,為了在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM