跳至主要內容

MinIO

code中间件MinIO约 672 字大约 2 分钟

MinIO

在使用时,用的是 MinioClient 对象

MinIO 是一个高性能的对象存储系统,设计初衷是作为云原生存储系统的替代方案

对象存储的概念与标准 Unix 文件系统类似,但 它使用的是"桶(bucket)"和"对象(object)"的概念,而不是目录和文件

桶可以像目录一样嵌套形成层级结构,而对象则是一组任意的字节数据,可以是图片、PDF 或其他任何文件类型

与文件系统类似,桶和对象也可以设置权限,实现细粒度的访问控制

在安装好 MinIO 后,可以去基于 Web 的管理控制台访问管理

MinIO JAVA SDK

不过在 JAVA 中更多的是通过 Java SDK 使用 MinIO

首先在项目中添加依赖:

<dependency>
    <groupId>io.minio</groupId>
    <artifactId>minio</artifactId>
    <version>8.5.2</version>
</dependency>

之后,通过 Spring 的 @Value 以及 @Bean等注释,来自动注册一个 MinIOClient 的实例,用于之后的操作

主要配置文件在 MinioConfig

@Configuration
public class MinioConfig {
  @Value("${minio.endpoint}")
  private String endpoint;

  @Value("${minio.accessKey}")
  private String accessKey;

  @Value("${minio.secretKey}")
  private String secretKey;

  @Value("${minio.publicUrl}")
  private String publicUrl;


  @Bean
  public MinioClient minioClient() {
      return MinioClient.builder()
              // 端口,存储地址
              .endpoint(endpoint)
              // 公钥和秘钥
              .credentials(accessKey, secretKey)
              .build();
  }

  @Bean
  public String minioPublicUrl() {
      return publicUrl;
  }
}

主要API

桶操作
  • bucketExists(BucketExistsArgs): 检查某个桶是否存在。

  • makeBucket(MakeBucketArgs): 创建新桶。

  • listBuckets(): 列出当前账号下所有的桶。

  • removeBucket(RemoveBucketArgs): 删除空桶。

注意:在上传文件前,通常会先调用 bucketExists 检查,不存在则调用 makeBucket 创建

对象操作

这是最频繁使用的部分,用于处理实际的文件

  • 上传
    • putObject(PutObjectArgs): 最通用的上传接口,支持从 InputStream 上传
    • uploadObject(UploadObjectArgs): 直接从本地磁盘文件路径上传,效率更高
  • 下载与查看
    • getObject(GetObjectArgs): 获取文件的输入流(InputStream),用于后端处理文件内容。
    • statObject(StatObjectArgs): 获取元数据(文件大小、最后修改时间、Content-Type 等),但不下载文件本身。
  • 列表与删除
    • listObjects(ListObjectsArgs): 遍历桶内的文件
    • removeObject(RemoveObjectArgs): 删除单个对象
    • removeObjects(RemoveObjectsArgs): 批量删除
预签名操作

是 MinIO 非常强大的一类 API,主要解决 “权限安全” 问题。

  • getPresignedObjectUrl(GetPresignedObjectUrlArgs): 生成一个带有时效性的 HTTP GET 链接

    场景: 你的文件是私有的,但你想让用户在接下来的 10 分钟内可以点击查看一张图片

简单示例

// 构建上传参数
minioClient.putObject(
  PutObjectArgs.builder()
      .bucket("my-bucket")
      .object("test.jpg")
      .stream(inputStream, size, -1) // -1 表示不限制分片大小
      .contentType("image/jpeg")      // 设置文件类型,方便浏览器直接预览
      .build()
);
上次编辑于: