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修改