首页 > 其他分享 >MinIO 常用 API 快速入门

MinIO 常用 API 快速入门

时间:2024-04-25 23:11:57浏览次数:17  
标签:minio builder bucket API 入门 build public minioClient MinIO

快速入门

minio 有开源版和收费版,使用开源版时,若修改了 minio 的源代码,需要将修改后的源代码完全公开。

启动 minio

minio 文档提供了多个运行环境的安装流程,此处以 windows 为例,其它运行环境文档上都有介绍。相关文档

  1. 下载 minio.exe:https://dl.minio.org.cn/server/minio/release/windows-amd64/minio.exe
  2. 运行 minio.exe
# 找到 minio 所在文件地址,运行 minio.exe
.\minio.exe server E:\minio --console-address :9090

E:\minio 是项目运行和文件存储的目录
--console-address 打印地址
9090 是项目的运行端口

image

打开终端显示的地址就能看到 minio 的项目页面,输入终端给出的 user 和 password

SpringBoot 集成

  1. 使用 idea 快速新建一个 SpringBoot 项目,在 pom 中添加 minio 的依赖
<dependency>
    <groupId>io.minio</groupId>
    <artifactId>minio</artifactId>
    <version>8.5.9</version>
</dependency>

maven 依赖的最新版本可在 Maven Central 网站中搜索关键词

  1. 编写 MinIOConfig 配置类
@Configuration
public class MinIOConfig {

    @Bean
    public MinioClient minioClient() {
        return MinioClient.builder()
                // 设置服务运行的地址
                .endpoint("http://192.168.202.1:9000")
                // 设置账号名和密码
                .credentials("minioadmin", "minioadmin")
                .build();
    }
}
  1. 编写 MinIOService 类的测试方法
@Service
public class MinIOService {

    @Resource
    private MinioClient minioClient;

    public void testMinIOClient() {
        System.out.println(minioClient);
    }
}
  1. 在单元测试类中调用 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 后台页面

image

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 是必须携带签名才能访问的,若想要直接访问图片地址,有两种方法

  1. 去后台将桶的访问权限由私有 private 改为 public

image

此方式不推荐,任何人都可以对该桶的文件信息上传,下载和删除

  1. 使用 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());

image

此时再向该桶 public-readonly-file 中上传文件 uploadObject,然后使用 getPresignedObjectUrl 获取图片访问地址

image

虽然 getPresignedObjectUrl 默认生成的还是带签名的地址,但是因为设置了公开读,所以可以去掉

标签:minio,builder,bucket,API,入门,build,public,minioClient,MinIO
From: https://www.cnblogs.com/jsonq/p/18157235

相关文章

  • 【vue3入门】-【13】class绑定
    class绑定数据绑定的一个常见需求场景是操纵元素的CSSclass列表,因为class是Attribute,我们可以和其他Attribute一样使用v-bind将它们动态的字符串绑定。但是,在处理比较复杂的绑定时,通过拼接生成字符串是麻烦且易出错的。因此,vue专门为class和v-bind用法提供了特殊的功能增强。除......
  • 【vue3入门】-【15】侦听器
    侦听器我们可以使用watch选项在每次响应式属性发生变化时触发一个函数<template><h3>侦听器</h3><!--不可以被监听,是固定的数据--><p>{{message}}</p><!--可以被监听,只能监听响应式数据(变化的数据)--><button@click="updateHandle">修改数据</button>&l......
  • 【vue3入门】-【14】style绑定
    style绑定数据绑定的一个常见需求场景式操作元素的cssstyle列表,因为style是一个Attribute,我们可以和其他Attribute一样使用v-bind,将它们和动态的字符串绑定。但是,在处理比较复杂的绑定时,通过拼接生成字符串是麻烦且容易出错的。因此,vue专门为style的v-bind用法提供了特殊的功能......
  • 【vue3入门】-【16】表单输入绑定
    表单输入绑定在前端处理表单时,我们常常需要将表单输入框的内容同步给JavaScript中相应的变量。手动连接值绑定和更改事件监听器可能会比较麻烦,v-model指令帮我们简化了这一步骤。<template><h3>表单输入绑定</h3><form><!--v-model:在页面中输入信息的同时,下......
  • 【vue3入门】-【18】组件组成
    组件组成组件最大的优势就是可复用性当使用构建步骤是,我们一般将vue组件定义在一个单独的.vue文件中,这杯叫做单文件组件(简称SFC)组件组成结构<!--承载所有的html标签,组件中必须要有的部分--><template> <div>承载标签</div></template><!--承载所有的业务逻辑,组件中可选......
  • 【vue3入门】-【17】模版引用
    模版引用虽然Vue的声明性渲染模型抽象了大部分的DOM的直接操作,但在某些情况下,我们仍然需要直接访问底层DOM元素。要实现这一点,我们可以使用特殊的refattribute挂载结束后引用都会被暴露在this.$refs只上,从this.$refs中按照js原生方法获取元素属性或变更元素属性<template>......
  • 【vue3入门】-【19】组件嵌套关系
    组件嵌套关系组件允许我们将UI划分为独立的,可重用的部分,并且可以对每个部分进行单独的思考。在实际应用中,组件常常被阻止成层层嵌套的树状结构这和我们嵌套HTML元素的方式类似,Vue实现了自己的组件模型,使我们可以在每个组件内封装自定义内容和逻辑APP.vue<template><!--主......
  • 【vue3入门】-【5】属性绑定
    属性绑定双大括号不能在htmlattributes中使用。想要响应的绑定一个attribute,应该使用v-bind指令<script>exportdefault{data(){return{msg:"active",myid:"test-id"}}}</script><template><divclass="{{msg}......
  • 【vue3入门】-【6】条件渲染
    条件渲染在vue中,提供了条件渲染,这类似于javascript中的条件语句v-ifv-elsev-else-ifv-showv-if指令用于条件性的渲染一块内容,这块内容只会在指令的表达式返回真值时才会渲染。v-else指令则在前面的if指令都不满足时则执行的指令<template><div>条件渲染</div><......
  • 【vue3入门】-【7】列表渲染
    列表渲染v-for列表渲染可以使用一个v-for指令基于一个数组来渲染一个列表,v-for指令的值需要使用iteminitems形式的特殊语法,其中items是源数据的数组,而item是迭代项的别名,item是可以改名的,和{{}}内的名称保持一致就行,结合div或其他标签使用,可以获取列表内的多个属性值v-fo......