MinIO SDK使用示例


之前已经介绍过如何在 LinuxWindows 平台上构建服务,今天就介绍一下 Java 如何调用 MinIO 相关 API 进行开发。

一、工程创建

1. 依赖导入

MinIO 要求 okhttp 的版本大于 4.8.1 ,但其自带的默认为 3.14.8 ,因为需要将原本的okhttp 依赖排除,手动添加高于 4.8.1 的版本。

<dependency>
    <groupId>io.minio</groupId>
    <artifactId>minio</artifactId>
    <version>8.3.5</version>
    <!-- 排除原有 okhttp 依赖 -->
    <exclusions>
        <exclusion>
        <groupId>com.squareup.okhttp3</groupId>
        <artifactId>okhttp</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<!-- 重新导入 okhttp 依赖 -->
<dependency>
    <groupId>com.squareup.okhttp3</groupId>
    <artifactId>okhttp</artifactId>
    <version>4.9.2</version>
</dependency>

2. 初始对象

public void init() throws Exception {
    minioClient = MinioClient.builder()
            // 填入 minio API
            .endpoint("http://xxx:9000")
            // 填入用户名、密码
            .credentials("username", "password")
            .build();
}

二、桶操作

1. bucketExists()

用于判断对应存储桶是否已存在,通常在存入文件之前进行判断,如果不存在,应进行提示或者创建对应的存储桶。

public void ExistMinioBucket() throws Exception {
    boolean found = minioClient.bucketExists(
        BucketExistsArgs.builder()
                .bucket("bucket")
                .build());
    if (found) {
        System.out.println("bucket 已存在");
    } else {
        System.out.println("bucket 不存在");
    }
}

2. makeBucket()

新建存储桶,存储桶名不能重复且命名必须遵守 Amazon S3 标准(不能含有下划线等特殊字符,不能包含大写字符)。

public void CreateMinioBucket() throws Exception {
    minioClient.makeBucket(MakeBucketArgs.builder()
                .bucket("newbucket")
                .build());
    }

3. removeBucket()

只能删除空的存储桶,非空存储桶想要删除必须先清空桶内文件。

public void DeleteMinioBucket() throws Exception {
    minioClient.removeBucket(RemoveBucketArgs.builder()
                .bucket("bucket")
                .build());
}

三、文件操作

1. getObject()

从指定存储桶获取文件。

public void GetMinioFile() throws Exception {
    try (InputStream is = minioClient.getObject(
        GetObjectArgs.builder()
                .bucket("bucket")
                .object("1.csv")
                .build())) {
        int ch;
        while ((ch = is.read()) != -1) {
            // 控制台打印内容
            System.out.write(ch);
        }
    }catch (XmlParserException | ServerException | NoSuchAlgorithmException
    | InsufficientDataException | InvalidKeyException | IOException e) {
        // 生产环境中应针对异常进行分类处理,这里demo测试就简单抛出。
        throw new PrinterException();
    } catch (InvalidResponseException | ErrorResponseException | InternalException e) {
        throw new PrinterException();
    }
}

2. putObject()

MinIO 以完整文件名为唯一标识,如果文件名重复,则会直接覆盖,建议在原有文件名之前拼接一个 UUID 或者时间戳。

public void PutMinioFile() throws Exception {
    StringBuilder builder = new StringBuilder();
    // 文件名拼接时间戳前缀
    builder.append(UUID.randomUUID());
    builder.append("_1.csv");

    // 读取本地文件
    File file = new File("./resources/Files/test.csv");
    if (file.isFile()) {
        FileInputStream fis = new FileInputStream(file);
        try {
            minioClient.putObject(PutObjectArgs.builder()
                    .bucket("bucket")
                    .object(builder.toString())
                    .stream(fis, fis.available(), -1)
                    .build());
        } catch (IOException e) {
            e.printStackTrace();
        }
    } else {
        System.out.println("文件不存在!");
    }
}

3. listObjects()

(Ⅰ) 列出桶内所有文件相关信息

public void ListEntireMinio() throws Exception {
    Iterable<Result<Item>> results = minioClient.listObjects(
        ListObjectsArgs.builder()
            .bucket("bucket")
            .build());

    StringBuilder builder = new StringBuilder();
    for (Result<Item> result : results) {
        // 对查询结果进行简单拼接
        builder.append(result.get().objectName());
        builder.append(", ");
        builder.append(result.get().lastModified());
        builder.append(", ");
        builder.append(result.get().size());
        builder.append("\n");
    }
    System.out.println(builder);
}

(Ⅱ) 列出桶内某个时间点后的文件相关信息

public void ListPartMinio() throws Exception {
    Iterable<Result<Item>> results = minioClient.listObjects(
        ListObjectsArgs.builder()
                .bucket("bucket")
                .build());

    StringBuilder builder = new StringBuilder();
    // 设置时间点
    Timestamp earliest = Timestamp.valueOf("1970-01-01 00:00:001");

    for (Result<Item> result : results) {
        Timestamp timestamp = Timestamp.from(result.get().lastModified().toInstant());
        // 如果文件最新更新时间在上述指定的时间之后进行打印
        if(timestamp.after(earliest)){
            // 打印:文件名,最后创建时间,文件大小
            builder.append(result.get().objectName());
            builder.append(", ");
            builder.append(timestamp);
            builder.append(", ");
            builder.append(result.get().size());
            builder.append("\n");
        }
    }
    System.out.println(builder);
}

(Ⅲ) 指定从某一个字符之后开始列出文件信息

例如newbucket桶内存有三个文件:a.csv, b.csv, c.csv,而startAfter("b")最终只会输出:b.csv, c.csv

public void ListAlphabetMinio() throws Exception {
    Iterable<Result<Item>> results = minioClient.listObjects(
            ListObjectsArgs.builder()
                    .bucket("bucket")
                    .startAfter("b")
                    .build());

    StringBuilder builder = new StringBuilder();
    for (Result<Item> result : results) {
        // 打印文件名,最后创建时间,文件大小
        builder.append(result.get().objectName());
        builder.append(", ");
        builder.append(result.get().lastModified());
        builder.append(", ");
        builder.append(result.get().size());
        builder.append("\n");
    }
    System.out.println(builder);
}

4. removeObject()

从指定存储桶内删除文件。

public void DeleteMinioFile() throws Exception {
    minioClient.removeObject(RemoveObjectArgs.builder()
                .bucket("newbucket")
                .object("1.csv")
                .build());
}

5. getPresignedObjectUrl()

用于生成文件外链,可以根据需求自定义外链访问请求方式。

public void MinioUrl() throws Exception{
    String bucketName = "webtest";
    String objectName = "1.jpg";
    Integer expires = 7;

    String url = minioClient.getPresignedObjectUrl(
        GetPresignedObjectUrlArgs.builder()
                .method(Method.GET)
                .bucket(bucketName)
                .object(objectName)
                .expiry(expires, TimeUnit.DAYS)
                .build());

    System.out.println(url);
}

源码:Minio API案例


文章作者: 烽火戏诸诸诸侯
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 烽火戏诸诸诸侯 !
  目录