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

啟動項(xiàng)目后,分別訪問:
http://localhost:9999/x.png
http://localhost:9999/xx.png
http://localhost:9999/xxx.png
正常返回圖片資源。
說明,SpringBoot默認(rèn)會挨個從pubic、resources、static里面找是否存在相應(yīng)的資源,如果有則直接返回。
可以看出這里的靜態(tài)資源都在classpath下。
那么就出現(xiàn)問題:
- 應(yīng)用的文件資源不能和項(xiàng)目代碼分開存儲
- 項(xiàng)目打包困難,當(dāng)上傳的文件越來越多,項(xiàng)目的打包jar越來越大
- 代碼與文件數(shù)據(jù)不能分開存儲,就意味著文件數(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)資源可以直接對外提供HTTP訪問服務(wù)
四、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>訪問測試,點(diǎn)擊"選擇文件",之后"保存":

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

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

