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

點擊minio進入查看maven依賴,可以看到最新版為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'
第二步:(整合到項目中)
1.將依賴添加到新建的springboot項目中,在pom.xml添加
2.配置minio客戶端,不會的話參考minio java sdk文檔,但是這個文檔給的是3.0.10版本的sdk,與新版的不兼容,最新版的還是看github地址
| 參數(shù) | 說明 |
|---|---|
| Endpoint | 對象存儲服務的URL |
| Access Key | Access key就像用戶ID,可以唯一標識你的賬戶 |
| Secret Key | Secret key是你賬戶的密碼 |
默認安裝不指定Access key 和Secret key 的話都是minioadmin, Endpoint則為服務器地址:如我安裝的的端口為1024,那Endpoint就是:http://localhost:1024
為了方便我們通過bean的方式注入客戶端如下:
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 客戶端
* @return
*/
@Bean
public MinioClient minioClient(){
return MinioClient.builder()
.endpoint(endpoint)
.credentials(accessKey, secretKey)
.build();
}
}
ok,現(xiàn)在客戶端已注入spring容器中,在使用的時候,只需要獲取就可以了。
第三步: 文件上傳
1.新增一個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中新增好的,如果沒有的話,可以自己手動添加,也可以通過代碼添加,具體參考sdk的說明,這里就不多說了。
2.通過postman測試文件上傳

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

看到剛上傳的文件就說明成功了。
3.其他說明,如何通過瀏覽器訪問剛上傳的圖片呢,就是通過endpoint服務地址加bucket名稱加圖片的名稱,在本例子訪問路徑則為:http://localhost:1024/test/5b01ca40273bcf53f4e6d84c0c595642.gif,可是為什么點擊之后不能訪問呢,原因是因為每個bucket都有權(quán)限控制,要能訪問的話需要放開權(quán)限,用過阿里云的oss存儲的都應該知道這個機制的。

設置好后,再訪問:

ok,此時就可以正常訪問我們剛上傳的圖片了。
第四步:文件下載
在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");// 設置強制下載不打開
res.addHeader("Content-Disposition", "attachment;fileName=" + filename);
try ( ServletOutputStream stream = res.getOutputStream()){
stream.write(bytes);
stream.flush();
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
通過訪問下載地址:http://localhost:8421/download/5b01ca40273bcf53f4e6d84c0c595642.gif,文件下載下來能夠正常顯示,則說明成功。
總結(jié):
通過以上操作,我們已經(jīng)完成springboot與minio的整合,可以通過minio sdk實現(xiàn)文件上傳與下載功能。當然還有其他api操作,我就不多介紹了,都是一個思路,調(diào)用傳值就可以了,自己嘗試一下,就能get到了。今天就到這里,demo代碼會放到碼云上,需要的同學可以下載參考一下。最后,祝大家元旦快樂,喜歡我的文章記得關(guān)注我哦??!