MINIO在java中的使用

引言

​ MinIO 是全球领先的对象存储先锋,目前在全世界有数百万的用户. 在标准硬件上,读/写速度上高达183 GB / 秒 和 171 GB / 秒。对象存储可以充当主存储层,以处理Spark、Presto、TensorFlow、H2O.ai等各种复杂工作负载以及成为Hadoop HDFS的替代品--------引自官网的话。这么一看这个MINIO好nb啊,居然能这么快。 就凭这速度就值得我们学习一下。

环境介绍

​ 编程语言: 你爱我,我爱你的java

​ 框架: springboot

​ 还有今天的主角: MinIO

MinIo的部署

​ 其实官网的文档写的挺好的,就是有些老旧了,怕是远古版本。为什么这么说呢,因为我照着文档启动,愣是跑不起来,吐了啊。后来还是在社区问了问,然后好心的官方大人告诉了我,还是得吐槽一下,文档更新一下吧,胡思乱想(指找问题时,各种猜疑)很累人的。情况如下

​ http://slack.minio.org.cn/question/737

1、下载

​ 我们可以直接下载MinIO到本地运行,也可以使用容器下载并运行

​ 我使用的是docker

#docker 拉取 MinIo 镜像
docker pull minio/minio

2、运行

​ 如果你看了我上面发送的MinIO社区的链接,你想必应该也知道了启动方式。下面给出我在本机运行的真实案例

docker run -d -p 9000:9000  -p 9001:9001  -e "MINIO_ROOT_USER=AKIAIOSFODNN7EXAMPLE"  -e "MINIO_ROOT_PASSWORD=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY" -v E:\data:/data  -v E:\minio\config:/root/.minio  minio/minio server /data --console-address ":9001"

3、测试

​ 访问页面查看是否运行成功,输入我们在命令中打的用户名(MINIO_ROOT_USER)和密码(MINIO_ROOT_PASSWORD),其实用户名和密码duck不必写这么长,我当时应该是脑子坏掉了。

MINIO在java中的使用

​ 登录后,就可以看到如下界面,如果你也看到了这个界面,恭喜你完成了第一步,剩下还有999步。这样还是用一些操作的,你可以尝试一下。

MINIO在java中的使用

SpringBoot集成MinIo

1、pom添加依赖

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

2、yml增加MinIo配置

minio:
    endpoint: http://127.0.0.1:9000
    accesskey: SUCWGJ8W4H36HC7KR6XO
    secretkwy: d9OkZ14ab04zwCd/+6iEXbPqeVapDOaDvhYcw88r

3、在SpringBoot添加配置类

​ 配置文件值注入,这里我们获取了在yml的配置信息,用于下一步连接MinIO。

package com.zggk.mas.entity.sys;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

/**
 * minio 属性值
 */
@Data
@Component
@ConfigurationProperties(prefix = "minio")
public class MinioProp {
    //连接url
    private String endpoint;
    //公钥
    private String accesskey;
    //私钥
    private  String secretkwy;
}

​ 配置MinIO连接

package com.zggk.mas.config;

import com.zggk.mas.entity.sys.MinioProp;
import io.minio.MinioClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * minio核心配置类
 * 通过注入 MinIO 服务器的相关配置信息,得到 MinioClient 对象,我们上传文件依赖此对象
 */
@Configuration
public class MinioConfig {

    @Autowired
    private MinioProp prop;

    /**
     * 获取 MinioClient
     * @return MinioClient
     */
    @Bean
    public MinioClient minioClient() {
        return MinioClient.builder().endpoint(prop.getEndpoint()).
                credentials(prop.getAccesskey(),prop.getSecretkwy()).build();
    }
}

​ 接下来,我们要写一个MinIo上传的工具类

package com.zggk.mas.entity.util;

import com.zggk.mas.entity.sys.MinioProp;
import io.minio.*;
import io.minio.http.Method;
import io.minio.messages.Item;
import lombok.SneakyThrows;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.io.ByteArrayInputStream;
import java.io.InputStream;

/**
 * minio操作类
 */
@Component
public class MinioUtils {
    @Autowired
    private MinioClient client;
    @Autowired
    private MinioProp minioProp;

    /**
     * 创建桶
     *
     * @param bucketName 桶名称
     */
    @SneakyThrows
    public void createBucket(String bucketName) {
        boolean found =
                client.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());
        if (!found) {
            client.makeBucket(
                    MakeBucketArgs.builder()
                            .bucket(bucketName)
                            .region("cn-beijing")
                            .build());
        }
    }

    /**
     * 删除桶
     *
     * @param bucketName 桶名称
     */
    @SneakyThrows
    public void removeBucket(String bucketName) {
        client.removeBucket(RemoveBucketArgs.builder().bucket(bucketName).build());
    }

    /**
     * 获取文件信息
     *
     * @param bucketName 桶名称
     * @param objectName 文件名称
     * @return
     */
    @SneakyThrows
    public ObjectStat getObjectInfo(String bucketName, String objectName) {
        return client.statObject(StatObjectArgs.builder().bucket(bucketName).object(objectName).build());
    }

    /**
     * 上传文件
     *
     * @param bucketName 桶名称
     * @param objectName 文件名
     * @param stream     流
     * @param fileSize   文件大小
     * @param type       文件类型
     * @throws Exception
     */
    public void putObject(String bucketName, String objectName, InputStream stream, Long fileSize, String type) throws Exception {
        client.putObject(
                PutObjectArgs.builder().bucket(bucketName).object(objectName).stream(
                        stream, fileSize, -1)
                        .contentType(type)
                        .build());
    }


    /**
     * 判断文件夹是否存在
     *
     * @param bucketName 桶名称
     * @param prefix     文件夹名字
     * @return
     */
    @SneakyThrows
    public Boolean folderExists(String bucketName, String prefix) {
        Iterable<Result<Item>> results = client.listObjects(ListObjectsArgs.builder().bucket(bucketName)
                .prefix(prefix).recursive(false).build());
        for (Result<Item> result:results){
            Item item = result.get();
            if (item.isDir()){
                return true;
            }
        }
        return false;
    }

    /**
     * 创建文件夹
     * @param bucketName 桶名称
     * @param path 路径
     */
    @SneakyThrows
    public void createFolder(String bucketName,String path) {
        client.putObject(PutObjectArgs.builder().bucket(bucketName).object(path)
                .stream(new ByteArrayInputStream(new byte[]{}),0,-1).build());
    }

    /**
     * 获取文件在minio在服务器上的外链
     * @param bucketName 桶名称
     * @param objectName 文件名
     * @return
     */
    @SneakyThrows
    public String getObjectUrl(String bucketName,String objectName){
        return client.getPresignedObjectUrl(
                     GetPresignedObjectUrlArgs.builder()
                           .method(Method.GET)
                          .bucket(bucketName)
                          .object(objectName)
                          .build());
    }

}

​ 到此我们就可以愉快的使用MinIo了,速度几十迈,心情是*自在。

结语

​ 如果您发现文章有什么问题,劳烦您为孩子指点一二,谢谢了您内。

上一篇:minio实现文件上传下载和删除功能


下一篇:讲师头像上传后端实现