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

啟動(dòng)項(xiàng)目后,分別訪問(wèn):
http://localhost:9999/x.png
http://localhost:9999/xx.png
http://localhost:9999/xxx.png
正常返回圖片資源。
說(shuō)明,SpringBoot默認(rèn)會(huì)挨個(gè)從pubic、resources、static里面找是否存在相應(yīng)的資源,如果有則直接返回。
可以看出這里的靜態(tài)資源都在classpath下。
那么就出現(xiàn)問(wèn)題:
- 應(yīng)用的文件資源不能和項(xiàng)目代碼分開(kāi)存儲(chǔ)
- 項(xiàng)目打包困難,當(dāng)上傳的文件越來(lái)越多,項(xiàng)目的打包jar越來(lái)越大
- 代碼與文件數(shù)據(jù)不能分開(kāi)存儲(chǔ),就意味著文件數(shù)據(jù)的備份將變得復(fù)雜
三、方案
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 為與項(xiàng)目代碼分離的靜態(tài)資源路徑,即:文件上傳保存根路徑
- 配置 spring.web.resources.static-locations 除了帶上SpringBoot默認(rèn)的靜態(tài)資源路徑之外,加上file:${demo.web.upload-path}指向外部的文件資源上傳路徑,即:該路徑下的靜態(tài)資源可以直接對(duì)外提供HTTP訪問(wèn)服務(wù)
四、Java Code
public String upload(MultipartFile file, HttpServletRequest request) {
if (file == null) {
throw new BizException("參數(shù)為空");
}
// 在 uploadPath 文件夾中通過(guò)日期對(duì)上傳的文件歸類保存
// 例如:/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();
}
// 對(duì)上傳的文件重命名, 避免文件重名
String oldName = file.getOriginalFilename();
String newName = UUID.randomUUID().toString()
+ oldName.substring(oldName.lastIndexOf("."), oldName.length());
try {
// 文件保存
file.transferTo(new File(folder, newName));
// 返回上傳文件的訪問(wèn)路徑
// 例如: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)錯(cuò)誤");
}
}五、模擬文件
將此 upload.html 文件放到 classpath:public 目錄下,對(duì)外提供訪問(wèn)。
如下:

<!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="請(qǐng)選擇上傳文件">
<input type="submit" value="保存">
</form>
</body>
</html>訪問(wèn)測(cè)試,點(diǎn)擊"選擇文件",之后"保存":

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

瀏覽器端響應(yīng)結(jié)果如下,返回一個(gè)文件HTTP訪問(wèn)路徑:
http://localhost:9999/2022/02/22/df9a66f1-760b-4f95-9faf-b5a216966718.png
使用該HTTP訪問(wèn)路徑,在瀏覽器端訪問(wèn)效果如下。
證明我們的文件已經(jīng)成功上傳到服務(wù)端,以后需要訪問(wèn)該圖片就通過(guò)這個(gè)HTTP URL就可以了?。?!
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java客戶端調(diào)用.NET的WebService實(shí)例
下面小編就為大家?guī)?lái)一篇Java客戶端調(diào)用.NET的WebService實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-09-09
Spring中@ExceptionHandler注解的工作原理詳解
這篇文章主要介紹了Spring中@ExceptionHandler注解的工作原理詳解,Spring Web注解@ExceptionHandler可以用來(lái)指定處理某類異常的控制器方法,從而在這些異常發(fā)生時(shí),會(huì)有相應(yīng)的控制器方法來(lái)處理此類異常,需要的朋友可以參考下2024-01-01
java分析html算法(java網(wǎng)頁(yè)蜘蛛算法示例)
近來(lái)有些朋友在做蜘蛛算法,或者在網(wǎng)頁(yè)上面做深度的數(shù)據(jù)挖掘,下面使用示例2014-03-03
servlet下載文件實(shí)現(xiàn)代碼詳解(五)
這篇文章主要為大家詳細(xì)介紹了servlet下載文件的實(shí)現(xiàn)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-09-09
基于Java實(shí)現(xiàn)的Dijkstra算法示例
這篇文章主要介紹了基于Java實(shí)現(xiàn)的Dijkstra算法示例,一個(gè)比較典型的算法示例,需要的朋友可以參考下2014-07-07
Spring Boot 自動(dòng)配置的實(shí)現(xiàn)
這篇文章主要介紹了Spring Boot 自動(dòng)配置的實(shí)現(xiàn),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-08-08
使用IntelliJ IDEA查看類的繼承關(guān)系圖形(圖文詳解)
這篇文章主要介紹了使用IntelliJ IDEA查看類的繼承關(guān)系圖形,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的工作或?qū)W習(xí)具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-03-03
java 啟動(dòng)exe程序,傳遞參數(shù)和獲取參數(shù)操作
這篇文章主要介紹了java 啟動(dòng)exe程序,傳遞參數(shù)和獲取參數(shù)操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-01-01

