springboot 使用 minio的示例代码

下面是详细的攻略过程。

使用 Minio 存储文件

Minio是一个分布式对象存储服务,除了能提供文件存储、数据备份和归档之外,还能快速实现容量扩展。

使用 Minio 前需要先创建一个存储桶。

val minioEndpoint: String
val minioAccessKey: String
val minioSecretKey: String
val minioRegion: String
val minioBucket: String

val s3Client = AmazonS3ClientBuilder
                .standard()
                .withEndpointConfiguration(
                   EndpointConfiguration(minioEndpoint, minioRegion)
                )
                .withCredentials(
                   AWSStaticCredentialsProvider(
                       BasicAWSCredentials(minioAccessKey, minioSecretKey)
                   )
                ).build()

if (!s3Client.doesBucketExistV2(minioBucket)) {
    s3Client.createBucket(CreateBucketRequest(minioBucket)
       .withCannedAcl(CannedAccessControlList.PublicRead))
}

将以上代码写入到配置文件中即可创建 Minio 存储桶。

第一个示例代码

使用 Minio 进行文件上传和下载操作。在Spring Boot框架中,我们可以使用Java文件服务器client来上传或下载文件。

Java 文件服务器 client 的版本信息以及引入方式如下:

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

完成该框架的版本引入后,我们可以使用以下代码实现上传和下载文件的操作:

@Service
public class MinioService {
    private final MinioClient minioClient;

    public MinioService(MinioClient minioClient) {
        this.minioClient = minioClient;
    }

    private static final String DEFAULT_BUCKET_NAME = "default";
    private static final String DEFAULT_ENDPOINT = "http://127.0.0.1:9000";
    private static final String DEFAULT_ACCESSKEY = "minioadmin";
    private static final String DEFAULT_SECRETKEY = "minioadmin";

    // 创建 default bucket
    public void createDefaultBucket() {
        if (!isBucketExist(DEFAULT_BUCKET_NAME)) {
            try {
                minioClient.makeBucket(MakeBucketArgs.builder().bucket(DEFAULT_BUCKET_NAME).build());
            } catch (Exception e) {
                throw new RuntimeException("创建默认存储桶失败: " + DEFAULT_BUCKET_NAME);
            }
        }
    }

    // 查看 bucket 是否存在
    public boolean isBucketExist(String bucketName) {
        try {
            return minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());
        } catch (Exception e) {
            return false;
        }
    }

    // 上传文件到默认 bucket
    public void putString(String fileName, String content) {
        try {
            var bytes = content.getBytes(StandardCharsets.UTF_8);
            var metadata = new ObjectMetadata();
            metadata.setContentType(MediaType.TEXT_PLAIN_VALUE);
            metadata.setContentLength(bytes.length);
            var stream = new ByteArrayInputStream(bytes);
            var arg = PutObjectArgs.builder().bucket(DEFAULT_BUCKET_NAME).object(fileName).stream(stream, bytes.length, -1)
                .contentType(MediaType.TEXT_PLAIN_VALUE).build();
            minioClient.putObject(arg);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    // 下载一个文件到字符串
    public String getObjectAsString(String fileName) {
        try {
            var obj = minioClient.getObject(GetObjectArgs.builder().bucket(DEFAULT_BUCKET_NAME).object(fileName).build());
            var inputStream = obj.readAllBytes();
            return new String(inputStream, StandardCharsets.UTF_8);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

以上代码实现了一个 MinioService 服务类,我们可以向其中注入 MinioClient,并提供以下方法:

  • createDefaultBucket() 方法会检查 default bucket 是否存在,如果不存在,则创建一个 default bucket;
  • isBucketExist(String bucketName) 方法会查询指定名称的 bucket 是否存在;
  • putString(String fileName, String content) 方法会将字符串 content 上传到指定的 bucket;
  • getObjectAsString(String fileName) 方法会从 bucket 中下载指定的文件,并返回其内容的字符串。

使用该服务类的示例代码如下:

@RestController
@RequestMapping("/api/minio")
public class MinioExampleController {
    private final MinioService minioService;

    public MinioExampleController(MinioService minioService) {
        this.minioService = minioService;
    }

    @GetMapping("/echo/{id}")
    public String echo(@PathVariable String id) {
        minioService.createDefaultBucket();
        minioService.putString("echo", id);

        return minioService.getObjectAsString("echo");
    }
}

以上代码创建一个使用 Spring Boot 框架的 REST 接口服务,/api/minio/echo/{id} 路由接受一个参数 id。它调用 MinioServicecreateDefaultBucket() 方法,确保存储桶存在。然后使用 MinioServiceputString("echo", id) 方法将 id 存储为字符串。接下来使用 getObjectAsString("echo") 方法从存储桶中获取存储的字符串。最后返回获取的结果。

第二个示例代码

该示例代码展示了如何使用 Minio 实现文件的上传和下载操作。首先我们需要使用 MinioClient 客户端连接到 minio 服务器。

MinioClient minioClient = MinioClient.builder()
   .endpoint(endpoint)
   .credentials(accessKey, secretKey)
   .build();

以上代码创建了一个新的 MinioClient,其中包含了 minio 服务器的 IP、AK、SK 等信息。

  1. 文件上传

使用以下代码将文件上传到 Minio。

public void putObject(String bucketName, String objectName, String filePath, String contentType) throws IOException, InvalidBucketNameException, NoSuchAlgorithmException, InsufficientDataException, InvalidKeyException, NoResponseException, ErrorResponseException, InternalException, InvalidArgumentException, RegionConflictException {
    File file = new File(filePath);
    try {
        File file1 = new File(filePath);
        FileInputStream fis = new FileInputStream(file1);
        ObjectMetadata meta = new ObjectMetadata();
        meta.setContentType(contentType);
        PutObjectRequest request = new PutObjectRequest(bucketName, objectName, fis, meta);
        minioClient.putObject(request);
    } catch (Exception e) {
        e.printStackTrace();
    }
}
  1. 文件下载

使用以下代码从 Minio 下载文件。

public void getObject(String bucketName, String objectName, String path) throws IOException, InvalidKeyException, NoSuchAlgorithmException, InsufficientDataException, NoResponseException, ErrorResponseException, InternalException, InvalidArgumentException {
    File file = new File(path);
    minioClient.getObject(GetObjectArgs.builder().bucket(bucketName).object(objectName).build(), file.toPath());
}

在以上示例代码中,上传和下载文件时都要指定存储桶的名称,也要指定文件的名称,因此我们首先需要在 Minio 上创建一个存储桶。

minioClient.makeBucket(MakeBucketArgs.builder().bucket("download").build());

以上代码将在 Minio 上创建一个名称为 download 的存储桶。

我们可以使用以下示例代码将文件上传到 Minio 上。

String bucketName = "download";
String objectName = "demo.txt";
String filePath = "D:/webgl/three-js-first-demo/guid.js";
String contentType = "text/plain";
minioService.putObject(bucketName, objectName, filePath, contentType);

以上示例代码将本地文件 D:/webgl/three-js-first-demo/guid.js 上传到 Minio 存储桶 download 中,并给文件取名为 demo.txt

接下来,我们可以使用以下示例代码从 Minio 上下载文件。

String bucketName = "download";
String objectName = "demo.txt";
String filePath = "D:/demo.txt";
minioService.getObject(bucketName, objectName, filePath);

以上示例代码从 Minio 存储桶 download 中下载文件 demo.txt 并存储到本地的文件 D:/demo.txt

至此,这两个示例代码就完成了上传文件和下载文件的操作。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:springboot 使用 minio的示例代码 - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • 怎样给Kafka新增分区

    给 Kafka 新增分区的完整攻略可以分为以下步骤: 步骤一:检查Kafka生产者和消费者 在开始之前,确保您的 Kafka 生产者和消费者是运行正常。 步骤二:关闭Kafka的自动Topic创建功能 在 Kafka 的 server.properties 文件中,将 auto.create.topics.enable 的值改为 false ,关闭 Kafk…

    Java 2023年5月20日
    00
  • java转换字符串编码格式的方法

    下面是关于Java转换字符串编码格式的方法的完整攻略。 1. String与byte[]的相互转换 在进行编码转换之前,我们首先需要将字符串转换为字节数组或者将字节数组转换为字符串。在Java中,可以通过以下方式进行转换: 1.1 将String转换为byte[] 可以通过调用String对象的getBytes方法将字符串转换为字节数组,示例代码如下: St…

    Java 2023年5月20日
    00
  • MyBatis-Plus 之selectMaps、selectObjs、selectCount、selectOne的使用

    一、MyBatis-Plus之selectMaps、selectObjs、selectCount、selectOne的使用 selectMaps MyBatis-Plus提供的selectMaps方法可以返回一个List\<Map\<String, Object>>对象,其中包含查询的结果集中的每一行记录,每一行记录都会转成一个Map…

    Java 2023年5月20日
    00
  • java虚拟机原理:Class字节码二进制文件分析

    Java虚拟机原理:Class字节码二进制文件分析 什么是Class字节码? Java源代码最终被编译成一种被称为Java虚拟机字节码的特定格式。Java虚拟机会解析这些字节码并在运行时生成二进制机器指令。这就是为什么Java是一种跨平台的编程语言,因为它的源代码可以在不同类型的计算机上运行。 Class文件包括类或接口的信息,类加载器读取Class文件并将…

    Java 2023年5月19日
    00
  • java equals函数用法详解

    Java equals函数用法详解 介绍 在Java中,equals()是用来比较两个对象是否相等的函数。equals()方法是Object类中的方法,因此所有Java类都包含equals()方法。在默认情况下,equals()方法比较对象的引用地址是否相同,即两个对象是否是同一个实例。但是,我们可以覆盖equals()方法,来定义自己的相等规则。 equa…

    Java 2023年5月26日
    00
  • jsp网页登陆验证

    下面是 JSP 网页登陆验证的完整攻略: 1. 概述 在 JSP 开发中,经常需要进行用户登录验证。其中,登陆验证的基本过程为:用户将自己的用户名和密码输入到登录页面上,点击登录按钮后,通过将用户输入的账号和密码与数据库中存储的用户信息进行比对,来验证用户身份是否合法。在本文中,我们将从前端页面设计、后端数据库连接、用户验证等多个方面进行讲解,帮助大家更好地…

    Java 2023年6月15日
    00
  • Java使用ScriptEngine动态执行代码(附Java几种动态执行代码比较)

    Java使用ScriptEngine动态执行代码(附Java几种动态执行代码比较) 在Java中,我们有多种方法可以动态执行代码,包括使用ScriptEngine引擎、使用Java Compiler API、使用字节码增强框架等。其中,使用ScriptEngine引擎是最常见的一种方法。 ScriptEngine引擎 ScriptEngine是Java SE…

    Java 2023年5月23日
    00
  • Java毕业设计实战之养老院管理系统的实现

    Java毕业设计实战之养老院管理系统的实现攻略 一、项目概述 养老院管理系统是一款基于Java语言开发的管理系统,可实现对养老院人员、床位等资源进行管理,并可对养老院内发生的事情进行记录、统计和分析,让养老院管理更加高效、便捷。 二、项目特点 采用MVC架构,运用Spring Boot、MyBatis等框架和技术实现系统开发。 实现对登录的权限分配,管理员用…

    Java 2023年5月24日
    00
合作推广
合作推广
分享本页
返回顶部