SpringBoot項(xiàng)目圖片上傳
圖片上傳到本地
可參考視頻:
【springboot上傳圖片的兩種方式詳解(本地/OSS對象存儲(chǔ))】 https://www.bilibili.com/video/BV1TK411Z7ad/?share_source=copy_web&vd_source=7f0416c71bcbaf44e08ad58367e3f198
視頻前十分鐘是從0開始編寫圖片保存到本地,可以照著視頻敲出來,不想看也可以直接復(fù)制我下面的代碼
-
在Resources目錄下有一個(gè)upload.html文件,和一個(gè)static文件夾,static下又有一個(gè)images文件夾,如下圖
upload.html
-
upload.html
這里主要就是一個(gè)form表單,用來提交數(shù)據(jù),但是要注意的是我這個(gè)表單用了post和enctype=“multipart/form-data”,以及input的類型是file
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>上傳圖片</title> </head> <body> <form action="/uplaod" method="post" enctype="multipart/form-data"> <input type="file" name="file" value="請選擇你要上傳的圖片"> <input type="submit" value="上傳"> </form> </body> </html>
controller
-
UploadController
想直接看源碼的同學(xué)可以跳過分析,往下滑
為了方便演示,我把業(yè)務(wù)都放在controller,,首先我們要先分析文件上傳有幾步
-
文件校驗(yàn)(包括但不限于,圖片的大小、圖片的類型、圖片是否為空、上傳的是否是文件等)
- 我這里只做了一個(gè)判空的校驗(yàn),可以自己加需要的校驗(yàn)
if (file.isEmpty()) { return "圖片上傳失敗"; }
-
將圖片重命名,圖片重命名又可分為以下幾步
-
獲取原來文件的后綴名,可以使用
file.getOriginalFilename()
獲取原來的文件名String originalFilename = file.getOriginalFilename(); //原來的圖片名
-
生成一個(gè)隨機(jī)的新文件名,這里可以使用
UUID.randomUUID()
String uuid = UUID.randomUUID().toString().replace("-", "");
-
把新名稱和原后綴名拼接起來作為新的文件名
String fileName = uuid + ext;
-
-
把圖片上傳的指定的目錄下,我們這里講的是Resources,就以Resources為例
-
new ApplicationHome(this.getClass())
可以獲取當(dāng)前程序運(yùn)行的路徑ApplicationHome applicationHome = new ApplicationHome(this.getClass());
-
我們知道Java程序都是運(yùn)行的.class字節(jié)碼文件,所以
getDir()
獲取文件夾位置其實(shí)是.class字節(jié)碼文件的位置,需要使用getParentFile()
兩次回到項(xiàng)目的主程序目錄applicationHome.getDir().getParentFile().getParentFile().getAbsolutePath()
-
獲取到主目錄的絕對路徑拼接上從這里到Resources下的images
String pre = applicationHome.getDir().getParentFile().getParentFile().getAbsolutePath() + "\\src\\main\\resources\\static\\images\\";
-
最后通過
file.transferTo(new File(path));
把文件上傳到Resources下的images目錄,并且返回一個(gè)url地址String path = pre + fileName;
-
完整controller代碼:
@RestController public class UploadController { @PostMapping("/uplaod") public String upload(MultipartFile file) { //圖片校驗(yàn)(圖片是否為空,圖片大小,上傳的是不是圖片、圖片類型(例如只能上傳png)等等) if (file.isEmpty()) { return "圖片上傳失敗"; } //可以自己加一點(diǎn)校驗(yàn) 例如上傳的是不是圖片或者上傳的文件是不是png格式等等 這里省略 //獲取原來的文件名和后綴 String originalFilename = file.getOriginalFilename(); // String ext = "." + FilenameUtils.getExtension(orgFileName); --需要導(dǎo)依賴 String ext = "."+ originalFilename.split("\\.")[1]; //生成一個(gè)新的文件名(以防有重復(fù)的名字存在導(dǎo)致被覆蓋) String uuid = UUID.randomUUID().toString().replace("-", ""); String newName = uuid + ext; //拼接圖片上傳的路徑 url+圖片名 ApplicationHome applicationHome = new ApplicationHome(this.getClass()); String pre = applicationHome.getDir().getParentFile().getParentFile().getAbsolutePath() + "\\src\\main\\resources\\static\\images\\"; String path = pre + newName; try { file.transferTo(new File(path)); } catch (IOException e) { e.printStackTrace(); } return path; } }
-
注意:
這里截取后綴名我為了代碼簡潔,直接鏈?zhǔn)秸{(diào)用獲取
[1]
索引位置的后綴,但是這樣不太好,可以獲取分割出來的字符串?dāng)?shù)組的最后一個(gè)元素
運(yùn)行
-
啟動(dòng)Spring Boot項(xiàng)目
-
訪問 http://localhost:8080/upload.html 路徑,在瀏覽器打開upload.html
-
選擇上傳的圖片,點(diǎn)擊上傳
-
上傳成功后,瀏覽器返回保存后的絕對路徑(這里我為了容易看懂返回的是絕對路徑,一般項(xiàng)目中用到的其實(shí)是相對路徑),如果圖片上傳失敗,瀏覽器會(huì)顯示
圖片上傳失敗
的提示信息 -
圖片上傳完成之后,我們可以到項(xiàng)目中的==/images==目錄下查看,如果圖片存在就說明我們已經(jīng)成功的將圖片上傳到我們的項(xiàng)目中了
-
同樣,我們可以到瀏覽器訪問這張圖片
-
一般項(xiàng)目中其實(shí)并不會(huì)到這一步就結(jié)束,而是將這個(gè)圖片的路徑保存到數(shù)據(jù)庫,但是我這里就不繼續(xù)往下演示了
將圖片上傳到本地的功能也實(shí)現(xiàn)了,有需要的同學(xué)可以繼續(xù)往下看OSS對象存儲(chǔ)
OSS對象存儲(chǔ)
在分布式項(xiàng)目中,通常一個(gè)項(xiàng)目中會(huì)用到很多服務(wù)器,如果我們還像單體項(xiàng)目中將文件/圖片上傳到本地,而下一次訪問的時(shí)候,如果我們訪問的服務(wù)器不是上一次保存的服務(wù)器的話,我們就訪問不到自己上傳的數(shù)據(jù),這顯然不是我們希望的,這時(shí)候我們就用到OSS對象存儲(chǔ)
-
首先你需要一個(gè)阿里云OSS對象存儲(chǔ)
創(chuàng)建Bucket
- 名稱:隨便起
- 地域:想你的服務(wù)器在哪就選哪個(gè)(也是隨便選)
- 存儲(chǔ)類型:標(biāo)準(zhǔn)存儲(chǔ)
- 冗余存儲(chǔ):關(guān)閉
- 版本控制:關(guān)閉
- 讀寫權(quán)限:公共讀寫
具體流程可以參考視頻:
【springboot上傳圖片的兩種方式詳解(本地/OSS對象存儲(chǔ))】 https://www.bilibili.com/video/BV1TK411Z7ad/?share_source=copy_web&vd_source=7f0416c71bcbaf44e08ad58367e3f198
這個(gè)視頻從11分鐘開始講的是OSS對象存儲(chǔ),照著視頻做一樣可以實(shí)現(xiàn),另外本篇博客也是基于該視頻
-
代碼
-
導(dǎo)入依賴
<dependency> <groupId>com.aliyun.oss</groupId> <artifactId>aliyun-sdk-oss</artifactId> <version>3.15.0</version> </dependency> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.4</version> </dependency> <dependency> <groupId>commons-beanutils</groupId> <artifactId>commons-beanutils</artifactId> <version>1.9.3</version> </dependency>
-
新建一個(gè)工具類UploadUtil在util包下
-
需要到阿里云官網(wǎng)獲取幾個(gè)參數(shù)
-
阿里域名(開頭加https://,結(jié)尾加/,這個(gè)不能漏)
-
地域節(jié)點(diǎn)(開頭加http://,一樣不能少)
-
accessKeyId
-
accessKeySecret
-
-
生成一個(gè)新的文件名
-
使用OSS客戶端對象上傳圖片返回url
UploadUtil
public class UploadUtil { //域名(開頭需要https://,結(jié)尾要/) public static final String ALI_DOMAIN = "https://你的阿里云域名/"; public static String uploadImg(MultipartFile file) throws Exception { //生成的文件名 String uuid = UUID.randomUUID().toString().replace("-", ""); String originalFilename = file.getOriginalFilename(); String ext = "." + FilenameUtils.getExtension(originalFilename); String fileName = uuid + ext; //地域節(jié)點(diǎn)(開頭需要http://) String endpoint = "你的地域節(jié)點(diǎn)"; String accessKeyId = "你的accessKeyId"; String accessKeySecret = "你的accessKeySecret"; //OSS客戶端對象 OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret); ossClient.putObject( "你的倉庫名", //倉庫名 fileName, //文件名 file.getInputStream() ); ossClient.shutdown(); return ALI_DOMAIN + fileName; } }
controller
@PostMapping("/upImg") public String upImg(MultipartFile file) throws IOException { return UploadUtil.uploadImage(file); }
upload.html
<form action="/upImg" method="post" enctype="multipart/form-data"> <input type="file" name="file" value="上傳圖片"> <input type="submit" value="上傳"> </form>
-
-
測試方法和本地運(yùn)行一致
-
上傳成功后可以講路徑復(fù)制到瀏覽器訪問,也可以打開阿里云官網(wǎng)OSS對象存儲(chǔ)查看上傳的圖片
-
可能會(huì)遇到的問題
如何搭建spring boot項(xiàng)目
搭建一個(gè)spring boot項(xiàng)目
- pom.xml導(dǎo)入web依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
- 編寫啟動(dòng)類
@SpringBootApplication
public class Run {
public static void main(String[] args) {
SpringApplication.run(Run.class, args);
}
}
如何使用Postman測試文件上傳
如果要使用postman測試,可以不用寫html頁面
Params上加上Content-Type=multipart/form-data,Body中選擇form-data文章來源:http://www.zghlxwxcb.cn/news/detail-413119.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-413119.html
到了這里,關(guān)于SpringBoot項(xiàng)目上傳圖片(本地/OSS)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!