問題:spring boot 使用的是內嵌的tomcat, 文件上傳指定目錄時不知道文件上傳到哪個地方,不知道訪問路徑。
//部署到服務器的tomcat上時通常使用這種方式
request.getServletContext().getRealPath("picture/");
//然而在spring boot中內嵌的tomacat,所以是臨時目錄,如:C:\Users\Administrator\AppData\Local\Temp\tomcat-docbase.7776702262463059617.8080\picture\
spring boot 把靜態的文件在啟動的時候都會加載到classpath的目錄下的,package時把static目錄下的資源一起打包成jar包,所以上傳的文件不知相對於應用目錄在哪,也不知怎么寫訪問路徑合適。
如果上傳到項目的static目錄下是沒有效果的,需要重新build才能訪問到。
解決方法:
spring boot 的靜態資源默認配置為:
//映射到static(或/public、/resources、/META-INF/resources)目錄
spring: mvc: static-path-pattern: /** resources: static-locations: classpath:/META-INF/resources/,classpath:/resources/, classpath:/static/, classpath:/public/
通過代碼修改靜態資源配置(這里不能通過配置文件修改,因為會覆蓋默認配置):
@Configuration public class WebConfig extends WebMvcConfigurationSupport { @Override protected void addResourceHandlers(ResourceHandlerRegistry registry) {
//這是系統默認配置 registry.addResourceHandler("/**") .addResourceLocations("classpath:/META-INF/resources/") .addResourceLocations("classpath:/resources/") .addResourceLocations("classpath:/static/") .addResourceLocations("classpath:/public/");
//這是添加的配置,表示將/picture/..映射到E:/picture/目錄
registry.addResourceHandler("/picture/**").addResourceLocations("file:E:/picture/"); super.addResourceHandlers(registry); } }
這樣在上傳時將路徑設置為E:/picture/,在訪問上傳的圖片時如/picture/xxx.jpg就能訪問到圖片了。
參考文章:https://blog.csdn.net/u011144425/article/details/79225864