不知不覺(jué),2020馬上就過(guò)去了,在這最后一天的時(shí)間里,還是得把留下的內(nèi)容更新了。2021新的開(kāi)始,樹(shù)立新的目標(biāo),過(guò)去的就讓它成為過(guò)去吧。元旦臨近,在這里祝大家元旦快樂(lè)!今天我還是把上篇說(shuō)的Springboot整合minio的內(nèi)容更新一下,作為2020年最后一篇文章。廢話(huà)不多說(shuō),直接進(jìn)入主題。
第一步:查找minio最新依賴(lài),通過(guò)maven查詢(xún)網(wǎng)站查詢(xún),這搜索框輸入minio,如下:

點(diǎn)擊minio進(jìn)入查看maven依賴(lài),可以看到最新版為8.0.3
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>8.0.3</version>
</dependency>
gradle
compile group: 'io.minio', name: 'minio', version: '8.0.3'
第二步:(整合到項(xiàng)目中)
1.將依賴(lài)添加到新建的springboot項(xiàng)目中,在pom.xml添加
2.配置minio客戶(hù)端,不會(huì)的話(huà)參考minio java sdk文檔,但是這個(gè)文檔給的是3.0.10版本的sdk,與新版的不兼容,最新版的還是看github地址
| 參數(shù) | 說(shuō)明 |
|---|---|
| Endpoint | 對(duì)象存儲(chǔ)服務(wù)的URL |
| Access Key | Access key就像用戶(hù)ID,可以唯一標(biāo)識(shí)你的賬戶(hù) |
| Secret Key | Secret key是你賬戶(hù)的密碼 |
默認(rèn)安裝不指定Access key 和Secret key 的話(huà)都是minioadmin, Endpoint則為服務(wù)器地址:如我安裝的的端口為1024,那Endpoint就是:http://localhost:1024
為了方便我們通過(guò)bean的方式注入客戶(hù)端如下:
yml
spring:
# 配置文件上傳大小限制
servlet:
multipart:
max-file-size: 100MB
max-request-size: 100MB
# minio 參數(shù)配置
minio:
endpoint: http://localhost:1024
accessKey: minioadmin
secretKey: minioadmin
@Configuration
public class MinIoClientConfig {
@Value("${minio.endpoint}")
private String endpoint;
@Value("${minio.accessKey}")
private String accessKey;
@Value("${minio.secretKey}")
private String secretKey;
/**
* 注入minio 客戶(hù)端
* @return
*/
@Bean
public MinioClient minioClient(){
return MinioClient.builder()
.endpoint(endpoint)
.credentials(accessKey, secretKey)
.build();
}
}
ok,現(xiàn)在客戶(hù)端已注入spring容器中,在使用的時(shí)候,只需要獲取就可以了。
第三步: 文件上傳
1.新增一個(gè)UploadController控制器用于處理文件上傳,如下:
@RestController
public class UploadController {
@Resource
private MinioClient minioClient;
/**
* 文件上傳
* @param file
* @return
*/
@PostMapping("/upload")
public String upload(MultipartFile file){
try {
PutObjectArgs objectArgs = PutObjectArgs.builder().object(file.getOriginalFilename())
.bucket("test")
.contentType(file.getContentType())
.stream(file.getInputStream(),file.getSize(),-1).build();
minioClient.putObject(objectArgs);
return "ok";
} catch (Exception e) {
e.printStackTrace();
return e.getMessage();
}
}
}
注意這里的bucket是我提前在minio中新增好的,如果沒(méi)有的話(huà),可以自己手動(dòng)添加,也可以通過(guò)代碼添加,具體參考sdk的說(shuō)明,這里就不多說(shuō)了。
2.通過(guò)postman測(cè)試文件上傳

點(diǎn)擊執(zhí)行后返回ok,執(zhí)成功,此時(shí)通過(guò)minio web端看看文件是否上傳成功

看到剛上傳的文件就說(shuō)明成功了。
3.其他說(shuō)明,如何通過(guò)瀏覽器訪(fǎng)問(wèn)剛上傳的圖片呢,就是通過(guò)endpoint服務(wù)地址加bucket名稱(chēng)加圖片的名稱(chēng),在本例子訪(fǎng)問(wèn)路徑則為:http://localhost:1024/test/5b01ca40273bcf53f4e6d84c0c595642.gif,可是為什么點(diǎn)擊之后不能訪(fǎng)問(wèn)呢,原因是因?yàn)槊總€(gè)bucket都有權(quán)限控制,要能訪(fǎng)問(wèn)的話(huà)需要放開(kāi)權(quán)限,用過(guò)阿里云的oss存儲(chǔ)的都應(yīng)該知道這個(gè)機(jī)制的。

設(shè)置好后,再訪(fǎng)問(wèn):

ok,此時(shí)就可以正常訪(fǎng)問(wèn)我們剛上傳的圖片了。
第四步:文件下載
在UploadController控制其中新增download方法,如下:
/**
* 下載文件
* @param filename
*/
@GetMapping("/download/{filename}")
public void download(@PathVariable String filename, HttpServletResponse res){
GetObjectArgs objectArgs = GetObjectArgs.builder().bucket("test")
.object(filename).build();
try (GetObjectResponse response = minioClient.getObject(objectArgs)){
byte[] buf = new byte[1024];
int len;
try (FastByteArrayOutputStream os = new FastByteArrayOutputStream()){
while ((len=response.read(buf))!=-1){
os.write(buf,0,len);
}
os.flush();
byte[] bytes = os.toByteArray();
res.setCharacterEncoding("utf-8");
res.setContentType("application/force-download");// 設(shè)置強(qiáng)制下載不打開(kāi)
res.addHeader("Content-Disposition", "attachment;fileName=" + filename);
try ( ServletOutputStream stream = res.getOutputStream()){
stream.write(bytes);
stream.flush();
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
通過(guò)訪(fǎng)問(wèn)下載地址:http://localhost:8421/download/5b01ca40273bcf53f4e6d84c0c595642.gif,文件下載下來(lái)能夠正常顯示,則說(shuō)明成功。
總結(jié):
通過(guò)以上操作,我們已經(jīng)完成springboot與minio的整合,可以通過(guò)minio sdk實(shí)現(xiàn)文件上傳與下載功能。當(dāng)然還有其他api操作,我就不多介紹了,都是一個(gè)思路,調(diào)用傳值就可以了,自己嘗試一下,就能get到了。今天就到這里,demo代碼會(huì)放到碼云上,需要的同學(xué)可以下載參考一下。最后,祝大家元旦快樂(lè),喜歡我的文章記得關(guān)注我哦??!