Spring boot上傳檔案至專案根目錄的解決方案
Spring boot上傳檔案至專案根目錄的解決方案
需求是,上傳一張圖片到伺服器中,不需要進行額外的配置,返回圖片在專案中的相對路徑,可以直接通過這個專案路徑訪問到圖片檔案。
使用本文章的上傳方法上傳後:
在開發/測試的過程中,圖片會儲存在 專案路徑/target/classes/static資料夾下
打包部署後,圖片會儲存在 jar包同級目錄/static下
上傳檔案的步驟:
獲取請求引數中的檔案
獲取檔案儲存路徑
建立資料夾
獲取檔案儲存名
建立輸出流FileOutputStream
寫入輸出流
關閉輸出流
獲取請求引數中的檔案
在spring框架中提供了一個名為 org.springframework.web.multipart.MultipartFile 的介面用來接受請求中包含的檔案。
每個MultipartFile物件可以接受一個請求中的檔案。
但是我們不能夠直接將MultipartFile物件轉為java.io中的File物件,如果需要轉換,則需要呼叫MultipartFile物件的getInputStream()方法,通過輸入流轉換成檔案。
/* * @param file: 接受請求中的檔案 * @param files: 儲存請求中的多個檔案 */ @PostMapping("/file") public String uploadFile(MultipartFile file , MultipartFile files[]){ //檔案操作 saveFile(file); for(int i = 0 ;i<files.length;i++){ //檔案操作 saveFile(files[i]); } }
獲取檔案儲存路徑
首先需要明確,springboot專案在開發過程中的專案路徑和打成jar部署後的路徑不太一樣。
想要網頁通過檔案路徑直接訪問伺服器中的資原始檔,需要將檔案儲存在專案的靜態資原始檔夾中。
所以需要在專案配置檔案中,配置專案靜態資原始檔夾:
spring.resources.static-locations=classpath:static/
1
這樣輸入訪問檔案路徑後,伺服器會自動在靜態資原始檔夾中查詢是否儲存有相對應的靜態資源。
接著,需要在java程式碼中獲取到檔案路徑,通過Spring自帶的ResourcesUtils工具,呼叫
String path = new File(ResourceUtils.getURL("classpath:").getPath()).getAbsolutePath()
得到專案目錄絕對路徑
子資料夾名可自行根據需要新增
path = path + "{專案內層目錄}";
這樣就可以得到檔案儲存的基本路徑了。
得到基本路徑後,為防止路徑中資料夾不存在,對路徑指向的資料夾判斷是否存在,若不存在則建立資料夾。
File dirPath = new File(path);
if (!dirPath.exists()){
dirPath.mkdirs();
}
獲取檔名
為了保證客戶端訪問檔案時檔案格式一致,需要獲取到上傳檔案的名字包括拓展名。
而這可以通過MultipartFile物件的getOriginalName方法可以獲取到。
獲取到檔名字串後,再使用字串分割方法,將拓展名部分分割開得到拓展名。
對於新檔案的命名可以按照自己的想法命名,最後只需要加上與原始檔相同的拓展名即可。
儲存檔案
得到了檔案儲存的路徑和檔名後,就可以開始寫入檔案了。
OutputStream out = new FileOutputStream(absPath);//absPath為檔案儲存資料夾路徑+檔名
out.write(file.getBytes());//file為MulitpartFile物件
out.flush();
out.close();//關閉輸出流
寫入檔案後要記得關閉資料流
最後瀏覽器就可以通過ip地址/{專案內層目錄}/檔案儲存檔名.副檔名 訪問到靜態資源了
————————————————
版權宣告:本文為CSDN博主「xiyeyee」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處連結及本宣告。
原文連結:https://blog.csdn.net/INER1/article/details/117342899