SpringBoot整合Minio的過程(支持公有及私有bucket)
1、Bucket、Object
- Bucket 是存儲Object的邏輯空間,每個(gè)Bucket之間的數(shù)據(jù)是相互隔離的,對用戶而言,相當(dāng)于存放文件的頂層文件夾;
- Object 是存儲到MinIO的基本對象,對用戶而言,相當(dāng)于文件;
2、常用API
- bucketExists():用于檢查指定的存儲桶是否存在,返回布爾值,表示存儲桶是否存在;
- makeBucket():用于創(chuàng)建一個(gè)新的存儲桶(bucket),需要指定存儲桶的名稱;
- listBuckets():用于列出用戶有權(quán)訪問的所有存儲桶,返回存儲桶的列表;
- removeBucket():用于刪除一個(gè)已存在的存儲桶(bucket),刪除失敗會拋出異常;
- putObject():用于上傳文件到指定的存儲桶;
- statObject():用于檢查指定的對象(文件)的狀態(tài),判斷是否存在;
- getPresignedObjectUrl():用于生成一個(gè)對象(文件)的簽名URL,以便可以通過HTTP訪問;
- getObject():用于從指定的存儲桶中下載文件;
- listObjects():用于列出指定存儲桶中的所有對象(文件);
- removeObject():用于刪除指定存儲桶中的對象,需要指定存儲桶名稱和對象鍵;
3、整合SpringBoot
引入POM包:
<dependencies>
<!-- minio -->
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>8.5.9</version>
</dependency>
</dependencies>3.1、yaml配置
minio: # 連接地址 endpoint: http://127.0.0.1:9000 # 用戶名 accessKey: admin # 密碼 secretKey: 123456789 # 設(shè)置共有桶,具體名稱可以在MinIo后臺設(shè)置,可以直接訪問,格式:http://1ip:port/bucketName/fileName publicBucket: public-test # 設(shè)置私有桶,具體名稱可以在MinIo后臺設(shè)置,需要通過getPresignedObjectUrl方法獲取簽名鏈接 privateBucket: private-test
3.2、MinIo配置
MinIOInfoConfig:
@Data
@Component
@ConfigurationProperties(prefix = "minio")
public class MinIOInfoConfig {
/**
* 連接地址
*/
private String endpoint;
/**
* 用戶名
*/
private String accessKey;
/**
* 密碼
*/
private String secretKey;
/**
* 私有bucket
*/
private String privateBucket;
/**
* 公共bucket
*/
private String publicBucket;
}MinioConfig:
import io.minio.MinioClient;
import jakarta.annotation.Resource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MinioConfig {
@Resource
private MinIOInfoConfig minIOInfoConfig;
@Bean
public MinioClient minioClient() {
//鏈?zhǔn)骄幊蹋瑯?gòu)建MinioClient對象
return MinioClient.builder()
.endpoint(minIOInfoConfig.getEndpoint())
.credentials(minIOInfoConfig.getAccessKey(), minIOInfoConfig.getSecretKey())
.build();
}
}3.3、Bucket 操作
上傳文件前,需要先進(jìn)行Bucket 的創(chuàng)建操作,可以直接到MinIo后臺進(jìn)行創(chuàng)建,也可以通過API接口進(jìn)行創(chuàng)建,代碼示例如下
@Service
public class MinIOService {
@Resource
private MinioClient minioClient;
public void bucket() {
try {
String bucketName = "test-bucket";
// 判斷是否存在
boolean bucketExists = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());
System.out.println("bucketExists1 = " + bucketExists);
// 創(chuàng)建
minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());
// 再次判斷
bucketExists = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());
System.out.println("bucketExists2 = " + bucketExists);
// 查詢列表
List<Bucket> bucketList = minioClient.listBuckets();
List<String> list = bucketList.stream().map(Bucket::name).toList();
System.out.println("bucketList = " + list);
// 刪除
minioClient.removeBucket(RemoveBucketArgs.builder().bucket(bucketName).build());
// 再次判斷
bucketExists = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());
System.out.println("bucketExists3 = " + bucketExists);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}3.4、Object操作
1. 上傳文件
@Service
public class MinIOService {
@Resource
private MinioClient minioClient;
@Resource
private MinIOInfoConfig minIOInfoConfig;
public void upload(MultipartFile file) {
try {
String originalFilename = file.getOriginalFilename();
// 上傳文件
minioClient.putObject(PutObjectArgs.builder()
.bucket(minIOInfoConfig.getPrivateBucket())
.object(originalFilename)
.stream(file.getInputStream(), file.getSize(), -1)
.build()
);
// 判斷文件是否存在
// 獲取訪問地址
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}2、獲取文件狀態(tài)(是否存在)
@Service
public class MinIOService {
@Resource
private MinioClient minioClient;
@Resource
private MinIOInfoConfig minIOInfoConfig;
public void fileState(String fileName) {
try {
StatObjectResponse response = minioClient.statObject(StatObjectArgs.builder()
.bucket(minIOInfoConfig.getPrivateBucket())
.object(fileName)
.build());
System.out.println("response = " + response);
} catch (Exception e) {
log.error("文件不存在");
}
}
}3、生成帶簽名公共訪問連接
1、通過getPresignedObjectUrl方法,生成一個(gè)帶到期時(shí)間、簽名的URL,這個(gè)地址可以提供給沒有登錄的第三方共享訪問或者上傳對象,針對于Bucket為私有的情況。
2、對于共有的的文件,可以通過http://1ip:port/bucketName/fileName格式直接訪問。
@Service
public class MinIOService {
@Resource
private MinioClient minioClient;
@Resource
private MinIOInfoConfig minIOInfoConfig;
public String getPresignedObjectUrl(String fileName) {
try {
String presignedObjectUrl = minioClient.getPresignedObjectUrl(GetPresignedObjectUrlArgs.builder()
.bucket(minIOInfoConfig.getPrivateBucket())
.object(fileName)
// 設(shè)置過期時(shí)間,3分鐘
.expiry(3, TimeUnit.MINUTES)
.method(Method.GET)
.build());
System.out.println(presignedObjectUrl);
return presignedObjectUrl;
} catch (Exception e) {
return "獲取鏈接失敗";
}
}
}4、下載文件流
1、通過getObject()方法可以直接獲取文件流,將文件流通過瀏覽器直接下;
2、使用該方式的好處是,在業(yè)務(wù)上可以由前端傳入文件Id,服務(wù)端通過文件Id查詢到文件名稱再調(diào)用MinIO的API接口獲取文件流,這樣可以實(shí)現(xiàn)系統(tǒng)自身對文件的水平權(quán)限管理。
@Service
public class MinIOService {
@Resource
private MinioClient minioClient;
@Resource
private MinIOInfoConfig minIOInfoConfig;
public void getObjectByStream(String fileName, HttpServletResponse response) {
try {
GetObjectResponse getObjectResponse = minioClient.getObject(GetObjectArgs.builder()
.bucket(minIOInfoConfig.getPrivateBucket())
.object(fileName)
.build());
// 轉(zhuǎn)化為流
getObjectResponse.transferTo(response.getOutputStream());
} catch (Exception e) {
log.error("獲取文件失敗");
}
}
}5、獲取文件列表
@Service
public class MinIOService {
@Resource
private MinioClient minioClient;
@Resource
private MinIOInfoConfig minIOInfoConfig;
public void listObjects() {
try {
Iterable<Result<Item>> listObjects = minioClient.listObjects(ListObjectsArgs.builder()
.bucket(minIOInfoConfig.getPrivateBucket())
// 以xx開頭的文件名稱
// .prefix("/")
.build());
listObjects.forEach(itemResult -> {
try {
Item item = itemResult.get();
log.info("文件名稱:" + item.objectName());
} catch (Exception e) {
throw new RuntimeException(e);
}
});
} catch (Exception e) {
log.error("獲取文件失敗");
}
}
}6、刪除文件信息
@Service
public class MinIOService {
@Resource
private MinioClient minioClient;
@Resource
private MinIOInfoConfig minIOInfoConfig;
public void removeObject(String fileName) {
try {
// 單個(gè)刪除
minioClient.removeObject(RemoveObjectArgs.builder()
.bucket(minIOInfoConfig.getPrivateBucket())
.object(fileName)
.build());
// 批量刪除
List<DeleteObject> list = new ArrayList<>();
list.add(new DeleteObject(fileName));
minioClient.removeObjects(RemoveObjectsArgs.builder()
.bucket(minIOInfoConfig.getPrivateBucket())
.objects(list)
.build());
} catch (Exception e) {
log.error("刪除文件失敗");
}
}
}到此這篇關(guān)于SpringBoot整合Minio(支持公有及私有bucket)的文章就介紹到這了,更多相關(guān)SpringBoot整合Minio內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- minio的下載和springboot整合minio使用方法
- SpringBoot整合Minio實(shí)現(xiàn)文件上傳和讀取功能
- springboot整合minio的超詳細(xì)教程
- SpringBoot整合MinIO實(shí)現(xiàn)文件存儲系統(tǒng)的代碼示例
- 可能是全網(wǎng)最詳細(xì)的springboot整合minio教程
- Springboot整合minio實(shí)現(xiàn)文件服務(wù)的教程詳解
- SpringBoot整合Minio實(shí)現(xiàn)上傳文件的完整步驟記錄
- SpringBoot整合MinIO實(shí)現(xiàn)文件上傳的方法詳解
- SpringBoot整合minio快速入門教程(代碼示例)
- springboot整合minio實(shí)現(xiàn)文件上傳與下載且支持鏈接永久訪問
相關(guān)文章
Java中Spring Boot支付寶掃碼支付及支付回調(diào)的實(shí)現(xiàn)代碼
這篇文章主要介紹了Java中Spring Boot支付寶掃碼支付及支付回調(diào)的實(shí)現(xiàn)代碼,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-02-02
使用?Spring?Boot?Admin?監(jiān)控應(yīng)用狀態(tài)的詳細(xì)過程
這篇文章主要介紹了使用?Spring?Boot?Admin?監(jiān)控應(yīng)用狀態(tài),該模塊采集應(yīng)用的內(nèi)部信息,并暴露給外部的模塊,支持?HTTP?和?JMX,并可以與一些第三方監(jiān)控系統(tǒng)(如?Prometheus)整合,需要的朋友可以參考下2022-09-09
java對象數(shù)組實(shí)現(xiàn)學(xué)生信息管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了java對象數(shù)組實(shí)現(xiàn)學(xué)生信息管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-06-06
詳解如何獨(dú)立使用ribbon實(shí)現(xiàn)業(yè)務(wù)客戶端負(fù)載均衡
這篇文章主要為大家介紹了詳解如何獨(dú)立使用ribbon實(shí)現(xiàn)業(yè)務(wù)客戶端負(fù)載均衡,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06
Spring Security實(shí)現(xiàn)兩周內(nèi)自動登錄"記住我"功能
登錄過程中經(jīng)常使用的“記住我”功能,也就是我們經(jīng)常會在各種網(wǎng)站登陸時(shí)見到的"兩周內(nèi)免登錄",“三天內(nèi)免登錄”的功能。今天小編給大家分享基于Spring Security實(shí)現(xiàn)兩周內(nèi)自動登錄"記住我"功能,感興趣的朋友一起看看吧2019-11-11
如何運(yùn)行SpringBoot項(xiàng)目的方法
這篇文章主要介紹了如何運(yùn)行SpringBoot項(xiàng)目的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03

