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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM