一、概述
1.1什么是MinIO?
- MinIO 是一个非常轻量的服务,可以很简单的和其他应用的结合使用,它兼容亚马逊 S3 云存储服务接口,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等。
官网:https://min.io
中文:https://www.minio.org.cn/,http://docs.minio.org.cn/docs/
1.2常见的数据存储
MinIO存储基于对象存储(Object Storage)是一种数据存储架构,它以对象为单位来处理、存储和检索数据,每个对象都包含了数据本身以及元数据;
MinIO存储的元数据主要包括对象的描述信息,如用户(account)、存储桶(bucket)以及存储桶索引(bucket index)等;
文本数据:新闻报道、社交媒体文章、博客......
语音数据:音频形式存储的数据,语音
mp3文件...... 图像数据:各种图片......
视频数据:各种视频、电影......
非结构化数据:没有明确结构的数据,比如社交评论、日志文件......
1.3docker部署
docker run -p 9000:9000 -p 9001:9001 \
--name minio \
-d --restart=always \
-e "MINIO_ACCESS_KEY=minioadmin" \
-e "MINIO_SECRET_KEY=minioadmin" \
-e "MINIO_SERVER_URL=http://服务器ip:9000"
-v /home/minio/data:/data \
-v /home/minio/config:/root/.minio \
minio/minio server \
/data --console-address ":9001" -address ":9000"
Minio(官方docker版)容器部署时区问题
解决方案https://blog.csdn.net/yang2330648064/article/details/138453712
1.4页面访问操作
登录
访问:http://192.168.124.132:9090/login 用户名:密码 minioadmin:minioadmin
创建用户
创建组
创建accessKey和secretKey
点击下载
文件内容如下,保存文件,SDK操作文件的API需要用到
{"url":"http://192.168.124.132:9000","accessKey":"XO1JDovW2FTmGaBb","secretKey":"uG6wMfylUnOVH5WzwxqnldOWw2dMshNX","api":"s3v4","path":"auto"}
创建Bucket
上传文件
二、springboot整合MinIO
官方文档:https://min.io/docs/minio/linux/developers/minio-drivers.html
Java快速指南 — MinIO中文文档 | MinIO Linux中文文档
2.1maven配置
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>8.5.9</version>
</dependency>
2.2写配置
@Component
public class MinioConfig {
@Bean
public MinioClient minioClient() {
return MinioClient.builder()
.endpoint("http://ip:9000")
.credentials("minioadmin", "minioadmin")
.build();
}
}
2.3MInIO常见API
MinIO中的Bucket、Object
Bucket 是存储Object的逻辑空间,每个Bucket之间的数据是相互隔离的,对用户而言,相当于存放文件的顶层文件夹;
Object 是存储到MinIO的基本对象,对用户而言,相当于文件;
桶操作
- bucketExists() 用于检查指定的存储桶是否存在,返回布尔值,表示存储桶是否存在
- makeBucket() 用于创建一个新的存储桶(bucket),需要指定存储桶的名称;
- listBuckets() 用于列出用户有权访问的所有存储桶,返回存储桶的列表;
- removeBucket() 用于删除一个已存在的存储桶(bucket),删除失败会抛出异常;
@Autowired
private MinioClient minioClient;
@Test
void contextLoads() throws ServerException, InsufficientDataException, ErrorResponseException, IOException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException {
System.out.println(minioClient);
if(!minioClient.bucketExists(BucketExistsArgs.builder().bucket("lab-test").build())){
System.out.println("不存在创建bucket");
minioClient.makeBucket(MakeBucketArgs.builder().bucket("lab-test").build());
}
System.out.println(minioClient.bucketExists(BucketExistsArgs.builder().bucket("test").build()));
System.out.println(minioClient.listBuckets());
minioClient.removeBucket(RemoveBucketArgs.builder().bucket("test").build());
}
文件操作
- putObject():用于上传文件到指定的存储桶;
- statObject():用于检查指定的对象(文件)的状态;
- getPresignedObjectUrl():用于生成一个对象(文件)的签名URL,以便可以通过HTTP访问;
- getObject():用于从指定的存储桶中下载文件;
- listObjects():用于列出指定存储桶中的所有对象(文件);
- removeObject():用于删除指定存储桶中的对象,需要指定存储桶名称和对象键;
@Test
void testFile() throws Exception {
// 上传文件
File file = new File("D:\\workspace-java\\lab-test\\files\\1716776437448-1.jpg");
ObjectWriteResponse objectWriteResponse = minioClient.putObject(PutObjectArgs.builder()
.bucket("lab-test")
.object("test.jpg")
.stream(new FileInputStream(file), file.length(), -1)
.build()
);
System.out.println(objectWriteResponse);
ObjectWriteResponse objectWriteResponse2 = minioClient.uploadObject(UploadObjectArgs.builder()
.bucket("lab-test")
.object("test2.jpg")
.filename("D:\\workspace-java\\lab-test\\files\\1716776437448-1.jpg")
.build()
);
// 检查指定的对象(文件)的状态
try {
boolean isObjectExist = minioClient.statObject(StatObjectArgs.builder()
.bucket("lab-test")
.object("test3.jpg")
.build()
) != null;
System.out.println("文件存在");
}catch (Exception e){
System.out.println("文件不存在");
}
// 获取对象的URL
String presignedObjectUrl = minioClient.getPresignedObjectUrl(GetPresignedObjectUrlArgs.builder()
.bucket("lab-test")
.object("test.jpg")
.expiry(3, TimeUnit.MINUTES)
.method(Method.GET)
.build());
System.out.println(presignedObjectUrl);
// 下载文件
GetObjectResponse getObjectResponse = minioClient.getObject(GetObjectArgs.builder()
.bucket("lab-test")
.object("test.jpg")
.build());
System.out.println(getObjectResponse.transferTo(new FileOutputStream("D:\\workspace-java\\lab-test\\files\\123.jpg")));
// 查询文件夹底下所有文件
Iterable<Result<Item>> listObjects = minioClient.listObjects(ListObjectsArgs.builder()
.bucket("lab-test")
.build());
listObjects.forEach( itemResult -> {
try {
Item item = itemResult.get();
System.out.println(item.objectName());
} catch (Exception e) {
throw new RuntimeException(e);
}
});
//移除文件
minioClient.removeObject(RemoveObjectArgs.builder()
.bucket("lab-test")
.object("test.jpg")
.build());
}