靜態資源的虛擬路徑和獨立靜態資源管理系統的實現
一、什麼是虛擬路徑?
舉個例子:上傳一張圖片放到:D://group/29015054169244_投影.png
但是前臺訪問是這樣的:http://ip:port/image/29015054169244_投影.png
顯然這種訪問方式,應該是在tomcat下的專案靜態資原始檔夾下了,但是圖片不在那裡存放,為什麼能訪問到?
這就是虛擬路徑的作用了。
二、為什麼需要虛擬路徑?
1、業務資料(資源)與程式碼分離,防止碟符不夠或者後續修改重新部署等丟失;
2、當專案被打包成一個.jar
檔案部署時,再將上傳的檔案放到這個.jar
檔案中是有多麼低的效率;
3、網站資料的備份將會很痛苦。
三、虛擬路徑的配置:
1、tomcat 配置方式:con/server.xml (docBase就是實際的路徑,path是虛擬路徑,相當於把改路徑對映到伺服器中)
<!-- 設定圖片虛擬路徑[訪問時路徑為/image] -->
<Context path="/image" docBase="D:\group" reloadable="true" />
2、springboot 配置方式:
2-1、配置類:
import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; /** * 圖片絕對地址與虛擬地址對映 */ @Configuration public class WebMvcConfig extends WebMvcConfigurerAdapter { @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { //檔案磁碟圖片url 對映 //配置server虛擬路徑,handler為前臺訪問的目錄,locations為files相對應的本地路徑 registry.addResourceHandler("/image/**").addResourceLocations("file:///D:/group/"); } }
2-2、 另一種直接在配置檔案application.properties配置方式(這種是把專案下所有的靜態資源訪問對映到D:/group/下):
其中upload.download.path:自定義的屬性,指定了一個路徑,注意要以/
結尾;
spring.mvc.static-path-pattern=/**
表示所有的訪問都經過靜態資源路徑;
spring.resources.static-locations
在這裡配置靜態資源路徑,覆蓋預設配置,所以需要將預設的也加上,否則static
、public
等這些路徑將不能被當作靜態資源路徑,在這個最末尾的file:${
upload.download.path}
之所有要加file:
是因為指定的是一個具體的硬碟路徑,其他的使用classpath
指的是系統環境變數。
server.port=1122
upload.download.path=D:/group/
spring.mvc.static-path-pattern=/**
spring.resources.static-locations=classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/,file:${upload.download.path}
3、eclipse下配置:(參考網上的留著做參考用,未經驗證。。)
四、獨立靜態資源管理系統的實現(通過資料流來讀取圖片)
1、系統中需要用到大量的圖片和其他靜態檔案資源,考慮靜態資源的統一管理和伺服器效能(靜態資源快取等等,後話暫時不提),需要和restfulAPI介面分開,於是有了這個獨立的靜態資源管理系統(實際專案中是獨立於其他介面的,也是獨立分配了伺服器部署的。)
2、比如上傳一張圖片,會自動根據型別和分組情況放到預先配置好的路徑下,新的分組會新建資料夾存放,然後把型別和分組和圖片名稱一起存入資料庫待用。
訪問這張圖片:*/downloadImgOrVideo.do?type=12&path=group1/29015054169244_投影.png
客戶端並不知道圖片的真實存放位置,但是可以把型別和“分組路徑”發給服務端,服務端根據兩者資訊,去配置好的實際路徑下尋找這個圖片。