SpringBoot 系列教程(十八):SpringBoot通過url訪問獲取內部或者外部磁盤圖片

一、默認靜態資源映射規則

1. 有5個默認的靜態資源存放位置

在 Spring Boot 中,默認情況下,一共有5個位置可以放靜態資源,Spring Boot 默認將 /** 所有訪問映射到以下目錄,五個路徑分別是如下5個:

classpath:/META-INF/resources/
classpath:/resources/
classpath:/static/
classpath:/public/
"/" : 靜態資源存放在當前項目的根路徑下,放在這個根路徑下也是可以訪問的

 例如:

      (1)、在src/main/resources/目錄下創建 META-INF/resources文件夾,存放a.jpg 圖片文件      

      (2)、在src/main/resources/目錄下創建resources文件夾 ,存放圖片b.jpg  圖片文件      

      (3)、在src/main/resources/目錄下創建static文件夾 ,存放圖片c.jpg 圖片文件

      (4)、在src/main/resources/目錄下創建 public文件夾 ,存放圖片d.jpg 圖片文件         

      (5)、在src/main/resources/根目錄直接存放靜態資源文件,存放圖片e.jpg 圖片文件         

總結: 上面這幾個都是靜態資源的映射路徑,優先級順序爲:META-INF/resources > resources > static > public > /

2.配置application.yml的端口

# 開發環境配置
server:
  # 服務器的HTTP端口,默認爲8080
  port: 8787

3.瀏覽器分別訪問以下靜態資源:

http://localhost:8787/a.jpg
http://localhost:8787/b.jpg
http://localhost:8787/c.jpg
http://localhost:8787/d.jpg
http://localhost:8787/e.jpg

均能正常訪問相應的圖片資源。那麼說明,Spring Boot 默認會挨個從 public、 resources 、static目錄裏面找是否存在相應的資源,如果有則直接返回; 沒有則會跳轉到SpringBoot默認的404頁面。

講到這裏,我們已經知道了上面5種都是SpringBoot框架官方約定成俗的靜態資源默認存放的位置,以及默認的訪問映射到靜態資源文件的URL。 那麼接下來我們瞭解下在SpringBoot中如何自定義靜態資源映射。

二、自定義靜態資源映射配置,訪問靜態資源文件

在實際開發中,可能需要自定義靜態資源訪問路徑,我們有好幾種做法可以實現,首先可以繼承WebMvcConfigurerAdapter類來實現(注意: 在SpringBoot2.0及Spring 5.0 之後版本WebMvcConfigurerAdapter已被廢棄)

首先我貼一張項目靜態資源存放文件的圖:

1. a.jpg圖片存放在static默認的目錄下面,訪問:http://127.0.0.1:8787/a.jpg ,可以正確的訪問到

2. b.jpg圖片存放在static目錄下的img目錄裏面,img目錄就是根據需求我們自定義的一個存放靜態文件的文件夾,訪問: http://127.0.0.1:8787/img/b.jpg , 可以正常的訪問到

通過上述測試,我們可以將靜態資源訪問分爲以下兩類:

1. 訪問默認靜態資源目錄文件:

如果是訪問默認靜態資源目錄下的文件,直接使用:https:127.0.0.1/8787/a.jpg即可;

2. 訪問自定義文件夾存放靜態資源的文件:

如果是訪問以自定義文件夾形式存放靜態資源的文件,則需要帶上自定義的文件夾名稱,這樣一來雖然不用做任何配置,但是需要根據文件夾的名稱來確定訪問資源文件的URL,這樣及其不方便,爲了統一訪問靜態資源路徑,有如下3種配置方式。

3. 在項目的static-img文件夾下放一個圖片,我們就叫c.jpg

方式1:繼承WebMvcConfigurerAdapter類實現靜態資源配置

package com.thinkingcao.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

/**
 * 配置靜態資源映射
 * @author cao
 * @since 2019/01/23
 */
@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter {

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        //將所有/static/** 訪問都映射到classpath:/static/ 目錄下
        registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/img/");
    }
}

重啓項目,訪問靜態資源:http://localhost:8787/static/c.jpg , 能正常訪問static目錄下的c.jpg圖片資源。

方式2:在application.yml配置文件中配置(推薦)

在application.yml中添加配置,將所有靜態資源文件訪問都映射到classpath:/static/img 目錄下:

spring:
  mvc:
    #資源文件的訪問路徑,例如:http://127.0.0.1:8787/static/20190123115705.jpg
    static-path-pattern: /static/**
  resources:
    #資源文件存放的位置
    static-locations: classpath:/static/img/

 

重啓項目,訪問靜態資源:http://localhost:8787/static/c.jpg , 同樣能正常訪問static目錄下的c.jpg圖片資源。

注意:通過spring.mvc.static-path-pattern這種方式配置,會使Spring Boot的默認配置失效,也就是說/public 、/resources 等默認配置不能使用了

總結: 上述配置中配置了靜態模式爲/static/就只能通過/static/來訪問。

方式3:自定義配置類實現WebMvcConfigurer接口(推薦)

@Configuration
public class AdminWebMvcConfig implements WebMvcConfigurer {

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        // 設置項目靜態資源訪問
        registry.addResourceHandler("/static/**")
                .addResourceLocations("classpath:/static/img/");
    }

}

 

小結: 上面實現自定義靜態資源映射的實現一共有3種方式,其目的都是相同的,那就是不管靜態資源目錄結構如何,我的訪問前綴都是統一的,都是通過: http://localhost:8787/static/xx.jpg  的形式訪問,上述3中方式我推薦方式二和方式三。

三、自定義外部靜態資源映射,訪問本地磁盤圖片文件

想要實現自定義靜態資源映射地址,訪問某個磁盤上的圖片文件,這裏講解4種實現方式

方式1: application.yml文件中配置 (推薦)

spring:
  mvc:
    #訪問路徑,例如: 127.0.0.1:8787/images/aa.jpg
    static-path-pattern: /images/**
  resources:
    #資源存放的磁盤位置
    static-locations: file:D://Images//壁紙/

  本地磁盤圖片:

  

訪問靜態資源:http://127.0.0.1:8787/images/護眼模式_20190123110237.jpg

注意:

1. 如果yml中配置了項目訪問前綴context-path, 請注意,訪問路徑需要加上前綴,別漏掉了,注意細節問題。

訪問效果如下:

 

方式2: 繼承WebMvcConfigurerAdapter 類

在代碼上配置, 繼承WebMvcConfigurerAdapter類,但是在SpringBoot2.0和Spring 5.0 WebMvcConfigurerAdapter及之後的版本中已被廢棄,目前找到解決方案就有兩種,請往下看:

  •  重寫WebMvcConfigurerAdapter類 

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

/**
 * <pre>
 * @Description:配置靜態資源映射
 * @Aouth: cao_wencao
 * @Date: 2019-01-23 16:11
 * </pre>
 */
@Configuration
public class WebMvcConfiguration extends WebMvcConfigurerAdapter {
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        //addResourceHandler是指你想在url請求的路徑
        //addResourceLocations是圖片存放的真實路徑
        registry.addResourceHandler("/images/**").addResourceLocations("file:D://Images//壁紙/");
        super.addResourceHandlers(registry);
    }

}
  • 說到這裏,我列舉一下WebMvcConfigurerAdapter 比較常用的需要重寫的接口,後續用得着
/** 解決跨域問題 **/
public void addCorsMappings(CorsRegistry registry) ;
/** 添加攔截器 **/
void addInterceptors(InterceptorRegistry registry);
/** 這裏配置視圖解析器 **/
void configureViewResolvers(ViewResolverRegistry registry);
/** 配置內容裁決的一些選項 **/
void configureContentNegotiation(ContentNegotiationConfigurer configurer);
/** 視圖跳轉控制器 **/
void addViewControllers(ViewControllerRegistry registry);
/** 靜態資源處理 **/
void addResourceHandlers(ResourceHandlerRegistry registry);
/** 默認靜態資源處理器 **/
void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer)

 

方式3:實現WebMvcConfigurer接口(推薦)

實現WebMvcConfigurer接口這種方式是新版本中替代WebMvcConfigurerAdapter 已過時的一種解決方案。

  • 直接實現WebMvcConfigurer接口(官方推薦使用這個)
package com.thinkingcao.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
 * <pre>
 * @Description:
 * @Aouth: cao_wencao
 * @Date: 2019-01-23 17:28
 * </pre>
 */
@Configuration
public class WebMvcConfig implements  WebMvcConfigurer {
  

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/images/**").addResourceLocations("file:D://Images//壁紙/");
    }
}

訪問靜態資源文件: http://127.0.0.1:8787/images/護眼模式_20191229130634.jpg  

效果圖如下:

方式4 :繼承WebMvcConfigurationSupport類

繼承WebMvcConfigurationSupport類這種方式是新版本中替代WebMvcConfigurerAdapter 已過時的第二種解決方案。

  • 繼承WebMvcConfigurationSupport類
package com.thinkingcao.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;

/**
 * <pre>
 * @Description:
 * @Aouth: cao_wencao
 * @Date: 2019-01-23 17:39
 * </pre>
 */
@Configuration
public class WebMvcConfig extends WebMvcConfigurationSupport {

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/images/**").addResourceLocations("file:D://Images//壁紙/");
    }
}

訪問靜態資源文件:http://127.0.0.1:8787/images/護眼模式_20191229130648.jpg

效果圖如下:

 

  • 貼一下WebConfig繼承WebMvcConfigurationSupport類的常用配置

package com.thinkingcao.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;

/**
 * <pre>
 * @Description:
 * @Aouth: cao_wencao
 * @Date: 2019-01-23 17:39
 * </pre>
 */

@Configuration
public class WebConfig extends WebMvcConfigurationSupport {


    /**
     * 跨域支持
     *
     * @param registry
     */
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedOrigins("*")
                .allowCredentials(true)
                .allowedMethods("GET", "POST", "DELETE", "PUT")
                .maxAge(3600 * 24);
    }


    /**
     * 添加靜態資源--過濾swagger-api (開源的在線API文檔)
     *
     * @param registry
     */

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/images/**")
                .addResourceLocations("file:D:/Images/壁紙/");
        //過濾swagger
        registry.addResourceHandler("swagger-ui.html")
                .addResourceLocations("classpath:/META-INF/resources/");

        registry.addResourceHandler("/webjars/**")
                .addResourceLocations("classpath:/META-INF/resources/webjars/");

        registry.addResourceHandler("/swagger-resources/**")
                .addResourceLocations("classpath:/META-INF/resources/swagger-resources/");

        registry.addResourceHandler("/swagger/**")
                .addResourceLocations("classpath:/META-INF/resources/swagger*");

        registry.addResourceHandler("/v2/api-docs/**")
                .addResourceLocations("classpath:/META-INF/resources/v2/api-docs/");
    }

}

 

四、源碼

源碼: https://github.com/Thinkingcao/SpringBootLearning/tree/master/springboot-aop

 

 

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