快速入门
minio 有开源版和收费版,使用开源版时,若修改了 minio 的源代码,需要将修改后的源代码完全公开。
启动 minio
minio 文档提供了多个运行环境的安装流程,此处以 windows 为例,其它运行环境文档上都有介绍。相关文档
- 下载 minio.exe:https://dl.minio.org.cn/server/minio/release/windows-amd64/minio.exe
- 运行 minio.exe
# 找到 minio 所在文件地址,运行 minio.exe
.\minio.exe server E:\minio --console-address :9090
E:\minio
是项目运行和文件存储的目录
--console-address
打印地址
9090
是项目的运行端口
打开终端显示的地址就能看到 minio 的项目页面,输入终端给出的 user 和 password
SpringBoot 集成
- 使用 idea 快速新建一个 SpringBoot 项目,在 pom 中添加
minio
的依赖
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>8.5.9</version>
</dependency>
maven 依赖的最新版本可在 Maven Central 网站中搜索关键词
- 编写
MinIOConfig
配置类
@Configuration
public class MinIOConfig {
@Bean
public MinioClient minioClient() {
return MinioClient.builder()
// 设置服务运行的地址
.endpoint("http://192.168.202.1:9000")
// 设置账号名和密码
.credentials("minioadmin", "minioadmin")
.build();
}
}
- 编写
MinIOService
类的测试方法
@Service
public class MinIOService {
@Resource
private MinioClient minioClient;
public void testMinIOClient() {
System.out.println(minioClient);
}
}
- 在单元测试类中调用 Service 方法,后续的基础使用都在 test 中测试执行
@SpringBootTest
class MinioUseApplicationTests {
@Resource
private MinIOService minIOService;
@Test
void contextLoads() {
minIOService.testMinIOClient();
}
}
时间误差
如果开发环境和 minio 的环境不再同一个系统环境中,比如开发 windows,minio 运行 linux,此时就可能产生时间误差,调用 minio 的方法就会出现错误。
将 linux 系统时间同步
# 查看 linux 系统时间,此时和 windows 是有误差的
date
# 安装 ntpdate
yum install ntpdate -y
# 同步时间
ntpdate poll.ntp.org
# 再次查看并对比 windows 时间
date
MinioClient 常用 API
操作 Bucket
MinIO 的存储性质和 OSS 一样,都是对象存储。
Bucket
桶:对象存储中的存储空间,相当于文件夹Object
对象:相当于文件
1. bucketExists
判断桶是否存在
检查指定的存储桶是否存在,返回布尔,bucketExists
传入的是一个 BucketExistsArgs
构建器模式,异常抛出
boolean exists = minioClient.bucketExists(BucketExistsArgs.builder().bucket("test").build());
System.out.println("test文件夹是否存在:" + exists);
2. makeBucket
创建桶
创建一个新的存储桶(bucket),没有返回值,makeBucket
传入的是一个 MakeBucketArgs
构建器模式,创建失败会抛出异常
// 创建完也可以使用 bucketExists 查看是否存在,或者登陆后台网页查看
minioClient.makeBucket(MakeBucketArgs.builder().bucket("test").build());
3. listBuckets
所有桶列表
列出用户有权访问的所有存储桶(buckte),返回存储桶列表
List<Bucket> buckets = minioClient.listBuckets();
buckets.forEach(bucket -> {
System.out.println("name: " + bucket.name() + ";creationDate: " + bucket.creationDate());
});
4. removeBucket
删除桶
删除存储桶(bucket),没有返回值,removeBucket
传入的是一个 RemoveBucketArgs
构建器模式,删除失败会抛出异常
minioClient.removeBucket(RemoveBucketArgs.builder().bucket("test").build());
操作 Object
1. putObject
上传文件到桶中(旧方法)
File file = new File("C:\\Users\\j9967\\Downloads\\lifecycle-events.png");
FileInputStream stream = new FileInputStream(file);
ObjectWriteResponse response = minioClient.putObject(PutObjectArgs.builder()
.bucket("test") // 指定上传的桶
.object("my-test.jpg") // 上传到桶中之后的文件叫啥名字
// 文件流,文件大小,分片大小(通常为 -1,自动推断,若手动填写,必须在 5M -5G 之间)
.stream(stream, file.length(), -1)
.build());
查看 minio 后台页面
2. uploadObject
上传文件(新方法)
ObjectWriteResponse response = minioClient.uploadObject(UploadObjectArgs.builder()
.bucket("test")
.object("my-test2.jpg")
.filename("C:\\Users\\j9967\\Downloads\\lifecycle-events.png")
.build());
3. statObject
判断文件是否存在
如果查不到该文件,会直接报异常,所以 statObject
是肯定可以正常返回数据的
StatObjectResponse response = minioClient.statObject(StatObjectArgs.builder()
.bucket("test") // 查询的桶名
.object("my-test.jpg") // 文件名字
.build());
4. getPresignedObjectUrl
生成可访问的签名 url 地址
String url = minioClient.getPresignedObjectUrl(GetPresignedObjectUrlArgs.builder()
.bucket("test")
.object("my-test.jpg")
.method(Method.GET)
.build());
System.out.println(url);
可以限制 url 的访问过期时间 expiry(3, TimeUnit.HOURS)
指定该链接 3 小时后失效
如果要使用不带签名的访问地址,可直接查看下一小节
5. getObject
用于从存储桶中下载文件
将桶中的文件下载到 E盘 code 文件夹中
GetObjectResponse response = minioClient.getObject(GetObjectArgs.builder()
.bucket("public-readonly-file")
.object("my-public.jpg")
.build());
String fileName = response.object();
response.transferTo(new FileOutputStream("E:\\code\\" + fileName));
5. listObjects
获取桶中的所有文件
Iterable<Result<Item>> results = minioClient.listObjects(ListObjectsArgs.builder()
.bucket("public-readonly-file")
.build());
for (Result<Item> result : results) {
Item item = result.get();
System.out.println(item.lastModified() + "\t" + item.size() + "\t" + item.objectName());
}
5. removeObject
删除桶中的文件
minioClient.removeObject(RemoveObjectArgs.builder()
.bucket("public-readonly-file")
.object("my-public.jpg")
.build());
公开 url 访问权限
minio 默认生成的 url 是必须携带签名才能访问的,若想要直接访问图片地址,有两种方法
- 去后台将桶的访问权限由私有
private
改为public
此方式不推荐,任何人都可以对该桶的文件信息上传,下载和删除
- 使用
makeBucket
创建桶后,使用setBucketPolicy
设置访问策略,用户只读权限
注: setBucketPolicy
设置访问策略的桶必须存在,否则报错
String bucketName = "public-readonly-file";
// 创建桶
minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());
// 需要的就是这一串代码访问策略
String policyJsonString = "{\"Version\":\"2012-10-17\",\"Statement\":[{\"Sid\":\"PublicRead\",\"Effect\":\"Allow\",\"Principal\":{\"AWS\":\"*\"},\"Action\":[\"s3:GetObject\"],\"Resource\":[\"arn:aws:s3:::" + bucketName + "/*\"]}]}";
minioClient.setBucketPolicy(SetBucketPolicyArgs.builder()
.bucket(bucketName)
.config(policyJsonString)
.build());
此时再向该桶 public-readonly-file
中上传文件 uploadObject
,然后使用 getPresignedObjectUrl
获取图片访问地址
标签:minio,builder,bucket,API,入门,build,public,minioClient,MinIO From: https://www.cnblogs.com/jsonq/p/18157235虽然
getPresignedObjectUrl
默认生成的还是带签名的地址,但是因为设置了公开读,所以可以去掉