SpringBoot整合Minio的過程(支持公有及私有bucket)
1、Bucket、Object
- Bucket 是存儲Object的邏輯空間,每個Bucket之間的數(shù)據(jù)是相互隔離的,對用戶而言,相當于存放文件的頂層文件夾;
- Object 是存儲到MinIO的基本對象,對用戶而言,相當于文件;
2、常用API
- bucketExists():用于檢查指定的存儲桶是否存在,返回布爾值,表示存儲桶是否存在;
- makeBucket():用于創(chuàng)建一個新的存儲桶(bucket),需要指定存儲桶的名稱;
- listBuckets():用于列出用戶有權訪問的所有存儲桶,返回存儲桶的列表;
- removeBucket():用于刪除一個已存在的存儲桶(bucket),刪除失敗會拋出異常;
- putObject():用于上傳文件到指定的存儲桶;
- statObject():用于檢查指定的對象(文件)的狀態(tài),判斷是否存在;
- getPresignedObjectUrl():用于生成一個對象(文件)的簽名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 # 設置共有桶,具體名稱可以在MinIo后臺設置,可以直接訪問,格式:http://1ip:port/bucketName/fileName publicBucket: public-test # 設置私有桶,具體名稱可以在MinIo后臺設置,需要通過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() { //鏈式編程,構建MinioClient對象 return MinioClient.builder() .endpoint(minIOInfoConfig.getEndpoint()) .credentials(minIOInfoConfig.getAccessKey(), minIOInfoConfig.getSecretKey()) .build(); } }
3.3、Bucket 操作
上傳文件前,需要先進行Bucket
的創(chuàng)建操作,可以直接到MinIo后臺進行創(chuàng)建,也可以通過API接口進行創(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
方法,生成一個帶到期時間、簽名的URL,這個地址可以提供給沒有登錄的第三方共享訪問或者上傳對象,針對于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) // 設置過期時間,3分鐘 .expiry(3, TimeUnit.MINUTES) .method(Method.GET) .build()); System.out.println(presignedObjectUrl); return presignedObjectUrl; } catch (Exception e) { return "獲取鏈接失敗"; } } }
4、下載文件流
1、通過getObject()
方法可以直接獲取文件流,將文件流通過瀏覽器直接下;
2、使用該方式的好處是,在業(yè)務上可以由前端傳入文件Id
,服務端通過文件Id
查詢到文件名稱
再調(diào)用MinIO的API接口獲取文件流,這樣可以實現(xiàn)系統(tǒng)自身對文件的水平權限管理。
@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 { // 單個刪除 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("刪除文件失敗"); } } }
到此這篇關于SpringBoot整合Minio(支持公有及私有bucket)的文章就介紹到這了,更多相關SpringBoot整合Minio內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
- minio的下載和springboot整合minio使用方法
- SpringBoot整合Minio實現(xiàn)文件上傳和讀取功能
- springboot整合minio的超詳細教程
- SpringBoot整合MinIO實現(xiàn)文件存儲系統(tǒng)的代碼示例
- 可能是全網(wǎng)最詳細的springboot整合minio教程
- Springboot整合minio實現(xiàn)文件服務的教程詳解
- SpringBoot整合Minio實現(xiàn)上傳文件的完整步驟記錄
- SpringBoot整合MinIO實現(xiàn)文件上傳的方法詳解
- SpringBoot整合minio快速入門教程(代碼示例)
- springboot整合minio實現(xiàn)文件上傳與下載且支持鏈接永久訪問
相關文章
Java中Spring Boot支付寶掃碼支付及支付回調(diào)的實現(xiàn)代碼
這篇文章主要介紹了Java中Spring Boot支付寶掃碼支付及支付回調(diào)的實現(xiàn)代碼,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-02-02使用?Spring?Boot?Admin?監(jiān)控應用狀態(tài)的詳細過程
這篇文章主要介紹了使用?Spring?Boot?Admin?監(jiān)控應用狀態(tài),該模塊采集應用的內(nèi)部信息,并暴露給外部的模塊,支持?HTTP?和?JMX,并可以與一些第三方監(jiān)控系統(tǒng)(如?Prometheus)整合,需要的朋友可以參考下2022-09-09java對象數(shù)組實現(xiàn)學生信息管理系統(tǒng)
這篇文章主要為大家詳細介紹了java對象數(shù)組實現(xiàn)學生信息管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-06-06詳解如何獨立使用ribbon實現(xiàn)業(yè)務客戶端負載均衡
這篇文章主要為大家介紹了詳解如何獨立使用ribbon實現(xiàn)業(yè)務客戶端負載均衡,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-06-06Spring Security實現(xiàn)兩周內(nèi)自動登錄"記住我"功能
登錄過程中經(jīng)常使用的“記住我”功能,也就是我們經(jīng)常會在各種網(wǎng)站登陸時見到的"兩周內(nèi)免登錄",“三天內(nèi)免登錄”的功能。今天小編給大家分享基于Spring Security實現(xiàn)兩周內(nèi)自動登錄"記住我"功能,感興趣的朋友一起看看吧2019-11-11