SpringBoot實現(xiàn)本地文件存儲及預覽過程
一、前言
若使用本機存儲來存放文件資源
核心實現(xiàn)過程:
- 上傳文件,保存文件(本地磁盤)
- 返回文件HTTP訪問服務器路徑給前端,進行效果展示
二、儲備
服務端接收上傳的目的是提供文件的訪問服務,對于SpringBoot而言,其對靜態(tài)資源訪問提供了很好的支持,使用其提供的基本默認配置可以滿足開發(fā)需求,同時,又支持開發(fā)人員進行自定義配置。
SpringBoot默認將 / 所有訪問映射到一下目錄:**
classpath:/META-INF/resources
classpath:/static
classpath:/public
classpath:/resources
在src/main/resources下新建pubic、resources、static三個文件夾,分別放入x.png、xx.png、xxx.png三張圖片
如下:

啟動項目后,分別訪問:
http://localhost:9999/x.png
http://localhost:9999/xx.png
http://localhost:9999/xxx.png
正常返回圖片資源。
說明,SpringBoot默認會挨個從pubic、resources、static里面找是否存在相應的資源,如果有則直接返回。
可以看出這里的靜態(tài)資源都在classpath下。
那么就出現(xiàn)問題:
- 應用的文件資源不能和項目代碼分開存儲
- 項目打包困難,當上傳的文件越來越多,項目的打包jar越來越大
- 代碼與文件數(shù)據(jù)不能分開存儲,就意味著文件數(shù)據(jù)的備份將變得復雜
三、方案
SpringBoot為我們提供了 spring.resources.static-locations 配置自定義靜態(tài)文件的位置:
spring:
web:
resources:
static-locations: classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/,file:${demo.web.upload-path}
demo:
web:
upload-path: D:/data/- 配置 demo.web.upload-path 為與項目代碼分離的靜態(tài)資源路徑,即:文件上傳保存根路徑
- 配置 spring.web.resources.static-locations 除了帶上SpringBoot默認的靜態(tài)資源路徑之外,加上file:${demo.web.upload-path}指向外部的文件資源上傳路徑,即:該路徑下的靜態(tài)資源可以直接對外提供HTTP訪問服務
四、Java Code
public String upload(MultipartFile file, HttpServletRequest request) {
if (file == null) {
throw new BizException("參數(shù)為空");
}
// 在 uploadPath 文件夾中通過日期對上傳的文件歸類保存
// 例如:/2022/02/22/df9a66f1-760b-4f95-9faf-b5a216966718.png
String format = sdf.format(new Date());
File folder = new File(uploadPath + format);
if (!folder.isDirectory()) {
folder.mkdirs();
}
// 對上傳的文件重命名, 避免文件重名
String oldName = file.getOriginalFilename();
String newName = UUID.randomUUID().toString()
+ oldName.substring(oldName.lastIndexOf("."), oldName.length());
try {
// 文件保存
file.transferTo(new File(folder, newName));
// 返回上傳文件的訪問路徑
// 例如:http://localhost:9999/2022/02/22/df9a66f1-760b-4f95-9faf-b5a216966718.png
String filePath = request.getScheme() + "://" + request.getServerName()
+ ":" + request.getServerPort() + request.getContextPath() + "/" + format + newName;
return filePath;
} catch (IOException e) {
throw new BizException("系統(tǒng)錯誤");
}
}五、模擬文件
將此 upload.html 文件放到 classpath:public 目錄下,對外提供訪問。
如下:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/upload" method="post" enctype="multipart/form-data">
<input type="file" name="uploadFile" value="請選擇上傳文件">
<input type="submit" value="保存">
</form>
</body>
</html>訪問測試,點擊"選擇文件",之后"保存":

文件被保存到服務端的 demo.web.upload-path 指定的資源目錄下

瀏覽器端響應結果如下,返回一個文件HTTP訪問路徑:
http://localhost:9999/2022/02/22/df9a66f1-760b-4f95-9faf-b5a216966718.png
使用該HTTP訪問路徑,在瀏覽器端訪問效果如下。
證明我們的文件已經(jīng)成功上傳到服務端,以后需要訪問該圖片就通過這個HTTP URL就可以了?。。?/p>
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
Java中的ReentrantReadWriteLock使用詳解
這篇文章主要介紹了Java中的ReentrantReadWriteLock使用詳解,ReentrantReadWriteLock是Java中的一個鎖實現(xiàn),它提供了讀寫分離的功能,這種讀寫分離的機制可以提高并發(fā)性能,特別適用于讀多寫少的場景,需要的朋友可以參考下2023-11-11
透明化Sharding-JDBC數(shù)據(jù)庫字段加解密方案
這篇文章主要為大家介紹了透明化Sharding-JDBC數(shù)據(jù)庫字段加解密方案,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-02-02
Spring @ExceptionHandler注解統(tǒng)一異常處理和獲取方法名
這篇文章主要介紹了Spring注解之@ExceptionHandler 統(tǒng)一異常處理和獲取方法名,在實際項目中,合理使用@ExceptionHandler能夠提高代碼的可維護性和用戶體驗,通過本文的解析和實踐,讀者可以更好地理解和掌握@ExceptionHandler的用法和原理2023-09-09
java實現(xiàn)基于TCP協(xié)議網(wǎng)絡socket編程(C/S通信)
這篇文章主要介紹了java實現(xiàn)基于TCP協(xié)議網(wǎng)絡socket編程(C/S通信),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-10-10
emoji表情與unicode編碼互轉的實現(xiàn)(JS,JAVA,C#)
這篇文章主要介紹了emoji表情與unicode編碼互轉的實現(xiàn)(JS,JAVA,C#),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-01-01

