玩轉springboot:預設靜態資源和自定義靜態資源實戰
在web開發中,靜態資源的訪問是必不可少的,如:圖片、js、css 等資源的訪問。
spring Boot 對靜態資源訪問提供了很好的支援,基本使用預設配置就能滿足開發需求
一、預設靜態資源對映
Spring Boot 對靜態資源對映提供了預設配置
Spring Boot 預設將 /** 所有訪問對映到以下目錄:
classpath:/static
classpath:/public
classpath:/resources
classpath:/META-INF/resources
如:在resources目錄下新建 public、resources、static 三個目錄,並分別放入 a.jpg b.jpg c.jpg 圖片
瀏覽器分別訪問:
均能正常訪問相應的圖片資源。那麼說明,Spring Boot 預設會挨個從 public resources static 裡面找是否存在相應的資源,如果有則直接返回。
二、自定義靜態資源訪問
靜態資源路徑是指系統可以直接訪問的路徑,且路徑下的所有檔案均可被使用者直接讀取。
在Springboot中預設的靜態資源路徑有:classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/
,從這裡可以看出這裡的靜態資源路徑都是在classpath中(也就是在專案路徑下指定的這幾個資料夾)
試想這樣一種情況:一個網站有檔案上傳檔案的功能,如果被上傳的檔案放在上述的那些資料夾中會有怎樣的後果?
- 網站資料與程式程式碼不能有效分離;
- 當專案被打包成一個.jar檔案部署時,再將上傳的檔案放到這個.jar檔案中是有多麼低的效率;
- 網站資料的備份將會很痛苦。
此時可能最佳的解決辦法是將靜態資源路徑設定到磁碟的基本個目錄。
第一種方式
1、配置類
**
* @author 歐陽思海
* @date 2018/7/25 15:42
*/
@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
//將所有C:/Users/gzpost05/Desktop/springboot部落格/ 訪問都對映到/myTest/** 路徑下
registry.addResourceHandler("/myTest/**").addResourceLocations("file:C:/Users/gzpost05/Desktop/springboot部落格/");
}
}
上面的意思就是://將所有C:/Users/gzpost05/Desktop/springboot部落格/ 訪問都對映到/myTest/** 路徑下
2、重啟專案
例如,在C:/Users/gzpost05/Desktop/springboot部落格/中有一張1.png圖片
第二種方式
首先,我們配置application.properties
application.properties配置檔案
web.upload-path=C:/Users/gzpost05/Desktop/test/
spring.mvc.static-path-pattern=/**
spring.resources.static-locations=classpath:/META-INF/resources/,classpath:/resources/,\
classpath:/static/,classpath:/public/,file:${web.upload-path}
注意:
web.upload-path
:這個屬於自定義的屬性,指定了一個路徑,注意要以/結尾;
spring.mvc.static-path-pattern=/**
:表示所有的訪問都經過靜態資源路徑;
spring.resources.static-locations
:在這裡配置靜態資源路徑,前面說了這裡的配置是覆蓋預設配置,所以需要將預設的也加上否則static、public等這些路徑將不能被當作靜態資源路徑,在這個最末尾的file:${web.upload-path}之所有要加file:是因為指定的是一個具體的硬碟路徑,其他的使用classpath指的是系統環境變數
編寫測試類上傳檔案
/**
* @author 歐陽思海
* @date 2018/7/25 16:17
*/
@SpringBootTest
@RunWith(SpringRunner.class)
public class FileUploadTest {
@Value("${web.upload-path}")
private String path;
/** 檔案上傳測試 */
@Test
public void uploadTest() throws Exception {
File f = new File("C:/Users/gzpost05/Desktop/springboot部落格/1.png");
FileCopyUtils.copy(f, new File(path+"/aaa.png"));
}
@Test
public void listFilesTest() {
File file = new File(path);
for(File f : file.listFiles()) {
System.out.println("fileName : "+f.getName());
}
}
}
注意:這裡將C:/Users/gzpost05/Desktop/springboot部落格/1.png上傳到配置的靜態資源路徑下。
可以到得結果:
說明檔案已上傳成功,靜態資源路徑也配置成功。