ResourceHandlerRegistry的addResourceLocations方法設置linux路徑,訪問項目外圖片,親測可行

場景:部署的Springboot項目,打成jar包,需要通過url直接訪問jar外部路徑的資源,本人的Springboot爲2.1.11.RELEASE。

一、配置WebMvcConfigurer,設置url訪問靜態資源映射

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {

    /**
     * 日誌記錄器
     */
    private static final Logger logger = LoggerFactory.getLogger(WebMvcConfig.class);

    @Value("${image.baseImagePath}")
    private String baseImagePath;

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        //        addResourceHandler是指你想在url請求的路徑
        // addResourceLocations是圖片存放的真實路
        registry.addResourceHandler("/image/**")
                .addResourceLocations("file:" + baseImagePath)

          // 可以自定義資源處理類,對加載後的資源進行二次處理,比如圖片統一打標識、解密之類的      
        //.resourceChain(true).addTransformer(new SecretImageResourceTransformerSupport())
        ;

    }
}

二、添加application.yml,再配置中配置訪問的真是路徑

###############################    圖片真實存儲位置  #############################
image:
  baseImagePath: ./image_base64

三、服務器的部署路徑創建 image_base64文件夾,和jar同級目錄,裏面存放需要訪問的圖片

例如存放了12345.jpg圖片

四、啓動項目,訪問的 ip:端口/項目基本路徑/image/12345.jpg即可查看圖片,也可以支持路徑嵌套,在image_base64文件夾中在創建子目錄,訪問的時候加上即可。

例子:本人在application.yml中配置

server:
  port: 8089
  servlet:
    context-path: /test

圖片訪問路徑:localhost:8089/test/image/12345.jpg

 

==========================如果需要對取出的資源加特殊處理======================================

1、將 .resourceChain(true).addTransformer(new SecretImageResourceTransformerSupport())加上

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {

    /**
     * 日誌記錄器
     */
    private static final Logger logger = LoggerFactory.getLogger(WebMvcConfig.class);

    @Value("${image.baseImagePath}")
    private String baseImagePath;

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        //        addResourceHandler是指你想在url請求的路徑
        // addResourceLocations是圖片存放的真實路
        registry.addResourceHandler("/image/**")
                .addResourceLocations("file:" + baseImagePath)

          // 可以自定義資源處理類,對加載後的資源進行二次處理,比如圖片統一打標識、解密之類的      
        .resourceChain(true).addTransformer(new SecretImageResourceTransformerSupport())
        ;

    }
}

2、定義自己的圖片資源處理類 SecretImageResourceTransformerSupport,繼承ResourceTransformerSupport,具體操作步驟可以參考Spring源碼的CssLinkResourceTransformer

public class SecretImageResourceTransformerSupport extends ResourceTransformerSupport {

    private static String SUPPORT_IMG = "jpg";

    /** 日誌記錄器 */
    private static final Logger logger = LoggerFactory.getLogger(SecretImageResourceTransformerSupport.class);
    
    @Override
    public Resource transform(HttpServletRequest httpServletRequest, Resource resource, ResourceTransformerChain resourceTransformerChain) throws IOException {
        resource = resourceTransformerChain.transform(httpServletRequest, resource);

        String filename = resource.getFilename();
        if (!SUPPORT_IMG.equals(StringUtils.getFilenameExtension(filename))) {
            return resource;
        }

        byte[] bytes = FileCopyUtils.copyToByteArray(resource.getInputStream());
        // 本人做的的圖片解密,你也可以根據自己需要將bytes 做其他處理
        // bytes = DESUtil.decryptDES(bytes, DESUtil.DES_KEY);

        resource = new TransformedResource(resource, bytes);

        return resource;
    }
}

3、啓動服務重新訪問地址欄,就可以查看自己對圖片資源處理的結果。本人的代碼裏限制了只處理jpg格式,自己看情況而定。

 

原創不易,如果對你有用記得點贊哦,就是對我創作好文章的最大鼓勵!!!

謝謝老闆!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章