MinIO學習大綱
一、Spingboot整合MinIo
第1步:搭建SpringBoot項目:
第2步:引入minio依賴
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.jianqun</groupId><artifactId>jianqun-SpringBoot-All</artifactId><version>1.0-SNAPSHOT</version><properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><parent><artifactId>spring-boot-starter-parent</artifactId><groupId>org.springframework.boot</groupId><version>3.2.4</version></parent><dependencies><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><dependency><groupId>io.minio</groupId><artifactId>minio</artifactId><version>8.5.9</version></dependency></dependencies></project>
第3步: 創建MinIoClient客戶端:
- 1.連接minio服務器,創建客戶端連接
- 2.在service層注入MinIo組件:
第4步:編寫單元測試:
- 注入minio客戶端組件,進行單元測試
二、SpringBoot集成MinIO開發MinioClient線程安全問題
- 不存在線程安全問題
三、MinIO中的Bucket和Object解讀
- Bucket 是存儲Object的邏輯空間,每個Bucket之間的數據是相互隔離的,對用戶而言,相當于存放文件的頂層文件夾;
- Object 是存儲到MinIO的基本對象,對用戶而言,相當于文件;
四、SpringBoot集成MinIO - Bucket操作:
4.1.API介紹:
- bucketExists() : 用于
檢查指定的存儲桶是否存在
,返回布爾值,表示存儲桶是否存在 - makeBucket() : 用于
創建一個新的存儲桶(bucket)
,需要指定存儲桶的名稱 - listBuckets(): 用于
列出用戶有權訪問的所有存儲桶
,返回存儲桶的列表 - removeBucket() : 用于
刪除一個已存在的存儲桶(bucket)
,刪除失敗會拋出異常
4.2.使用bucketExists() 案例:
a.編碼實現:
package com.jianqun;import com.jianqun.service.MinioService;
import io.minio.BucketExistsArgs;
import io.minio.MinioClient;
import io.minio.errors.*;
import jakarta.annotation.Resource;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;import java.io.IOException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;@SpringBootTest
public class TestMinio {@Resourceprivate MinioService minioService;@Testvoid contextLoads(){minioService.testMinIOClient();}@Resourceprivate MinioClient minioClient;@Testpublic void testApi() throws Exception{// boolean isBucketExists = minioClient.bucketExists(BucketExistsArgs.builder().bucket("myFile").build()); //桶的名稱有錯誤,不符合命名規則boolean isBucketExists = minioClient.bucketExists(BucketExistsArgs.builder().bucket("myfile").build());System.out.println("myfile目錄是否存在" + isBucketExists);}
}
b.踩坑說明:
- 1.在我的測試方法中,我的桶名稱一開始是myFile,執行測試方法的時候報錯了
- 2.報錯內容如下,其原因是桶名稱不符合存Amazon S3 的命名規范
- 3.Amazon S3 對存儲桶名稱有一些嚴格的命名規則,以下是這些規則的簡要說明:
- 長度限制:存儲桶名稱的長度必須在 3 到 63 個字符之間
- 字符限制:存儲桶名稱只能包含小寫字母、數字、點(.)和連字符(-)
- 起始和結束字符:存儲桶名稱必須以字母或數字開頭和結尾
- 點號限制:存儲桶名稱中的點號不能連續出現(例如 …),也不能直接與連字符相鄰(例如 .- 或 -.)
- IP 地址格式:存儲桶名稱不能格式化為 IP 地址(例如 192.168.1.1)
4.3.使用makeBucket 案例
a.案例實現:
- 1.使用BucketExistsArgs.builder()來創建Bucket
b.查看頁面:
- 2.執行后頁面內容如下:
4.4.使用listBuckets案例
a.案例實現:
b.結果測試:
4.5.使用removeBucket案例
五、SpringBoot集成MinIO開發 - Object操作
5.1.API介紹:
- putObject():用于上傳文件到指定的存儲桶
- uploadObject():用于上傳文件到指定的存儲桶
- statObject():用于檢查指定的對象(文件)的狀態;
- getPresignedObjectUrl():用于生成一個對象(文件)的簽名URL,以便可以通過HTTP訪問;
- getObject():用于從指定的存儲桶中下載文件;
- listObjects():用于列出指定存儲桶中的所有對象(文件);
- removeObject():用于刪除指定存儲桶中的對象,需要指定存儲桶名稱和對象鍵;
5.2.使用putObject案例:
a.案例:
b.測試:
c.說明:
- 上傳到MinIO服務器上的文件是否可以通過 http://ip:9000/存儲桶/文件名直接訪問??默認情況下是不能直接訪問的;
- http://192.168.11.128:9000/myfile/test.jpg
- 方式一:在web管理后臺修改;(訪問策略修改為 public)
- 方式二:通過客戶端API修改;
5.2.使用uploadObject案例
a.案例:
b.測試:
5.3.使用statObject案例
a.案例:
c.測試:
5.4.getPresignedObjectUrl()
a.案例:
b.測試:
5.5.SpringBoot集成MinIO開發 - 開放訪問Url案例
a.默認情況:
- 默認情況下是不能直接訪問的:http://192.168.11.128:9000/myfile/test.jpg
b.實現url直接訪問:
1、把存儲桶裝該改成public的
- 1.當存儲桶的狀態是私有狀態的時候,所有的圖片訪問都需要帶有否測無法訪問,除非把存儲桶裝該改成public的
2、API方式:
- 通過客戶端API修改