基于MiniO实现上传下载等

1.在项目中添加MINIO的依赖、文中使用的是8.2.1

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

2.项目中配置相关配置文件、关于此处的命名可以自己定义、遵循yml文件格式即可

# 存储服务器
MINIO_PATH_URL: http://192.168.100.128
#存储文件块
MINIO_OSS_BUCKET: testa
#账号
MINIO_ACCESS_KEY: 4ctWALdoJ3kPFrfp
#密码
MINIO_SECRET_KEY: 2#n!amxIM@34fbjr@&aE3d*SGH1@!k7f
#类似于地区(类似与阿里云:杭州.........)
MINIO_REGION: cn-south-1

3.Utils代码

package com.example.*;

import io.minio.*;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import java.io.InputStream;
import java.text.SimpleDateFormat;


/**
 * @auther JiangYan
 * @date 2021/4/30 15:14
 * @desc MiniO分布式文件存储工具类
 */
@Component
public class MiniOUtils {
    /**
     * ACCESS_KEY
     */
    private static String MINIO_ACCESS_KEY;

    /**
     * 服务器路径
     */
    private static String MINIO_PATH_URL;

    /**
     * 文件存储块
     */
    private static String MINIO_OSS_BUCKET;

    /**
     * SECRET_KEY
     */
    private static String MINIO_SECRET_KEY;

    /**
     * REGION
     */
    private static String MINIO_REGION;

    @Value("${MINIO_ACCESS_KEY}")
    public void setMinioAccessKey(String minioAccessKey) {
        MINIO_ACCESS_KEY = minioAccessKey;
    }

    @Value("${MINIO_SECRET_KEY}")
    public void setMinioSecretKey(String minioSecretKey) {
        MINIO_SECRET_KEY = minioSecretKey;
    }

    @Value("${MINIO_REGION}")
    public void setMinioRegion(String minioRegion) {
        MINIO_REGION = minioRegion;
    }

    @Value("${MINIO_PATH_URL}")
    public void setMinioPathUrl(String minioPathUrl) {
        MINIO_PATH_URL = minioPathUrl;
    }

    @Value("${MINIO_OSS_BUCKET}")
    public void setMinioOssBucket(String minioOssBucket) {
        MINIO_OSS_BUCKET = minioOssBucket;
    }

    /**
     * 构建连接客户端
     */
    public static MinioClient minioClient = null;

    /**
     * init初始化
     */
    @Bean
    public static void intiMiiOClient() {
        MiniOUtils.minioClient = MinioClient.builder()
                .endpoint(MINIO_PATH_URL)
                .credentials(MINIO_ACCESS_KEY, MINIO_SECRET_KEY)
                .build();
    }

    /**
     * 创建桶
     *
     * @param bucket 桶
     */
    public static void makeBucket(String bucket) throws Exception {
        // 判断桶是否存在
        boolean isExist = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucket).build());
        if (!isExist) {
            // 新建桶
            minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucket).build());
        }
    }


    /**
     * 通过二进制流上传到MiniO存储
     *
     * @param file     文件
     * @param fileName 文件名
     * @return
     */
    public static String fileUpload2MiniO(MultipartFile file, String fileName) {
        fileName = getToDay() + "/" + fileName;
        try {
            boolean exists = minioClient.bucketExists(BucketExistsArgs.builder().bucket(MINIO_OSS_BUCKET).build());
            if (!exists) {
                //不存在就创建一个新的BUCKET
                minioClient.makeBucket(MakeBucketArgs.builder().bucket(MINIO_OSS_BUCKET).build());
            }
            minioClient.putObject(PutObjectArgs.builder().bucket(MINIO_OSS_BUCKET)
                    .object(fileName)
                    .stream(file.getInputStream(), file.getSize(), -1)
                    .contentType(file.getContentType()).build());
        } catch (Exception e) {
            new RuntimeException("上传发生错误!");
        }
        return MINIO_PATH_URL + "/" + MINIO_OSS_BUCKET + "/" + fileName;
    }

    /**
     * 文件下载
     *
     * @param fileName 文件名
     * @return InputStream
     */
    public static InputStream downLoadFile(String fileName) {
        InputStream inputStream = null;
        try {
            StatObjectResponse statObjectResponse = minioClient.statObject(StatObjectArgs.builder().bucket(MINIO_OSS_BUCKET).object(fileName).build());
            if (statObjectResponse.size() > 0) {
                inputStream = minioClient.getObject(GetObjectArgs.builder().bucket(MINIO_OSS_BUCKET).object(fileName).build());
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return inputStream;
    }

    /**
     * 删除文件
     *
     * @param fileName
     * @return flag
     */
    public static Boolean removeFile(String fileName) {
        boolean flag = false;
        try {
            minioClient.removeObject(RemoveObjectArgs.builder().bucket(MINIO_OSS_BUCKET).object(fileName).build());
            flag = true;
        } catch (Exception e) {
            e.printStackTrace();
            flag = false;
        }
        return flag;
    }


    /**
     * 删除桶(只有当桶中没有数据的时候才能删除)
     *
     * @param bucketName
     * @return
     */
    public static boolean removeBucket(String bucketName) {
        boolean exists = false;
        try {
            exists = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());
            if (exists) {
                minioClient.removeBucket(RemoveBucketArgs.builder().bucket(bucketName).build());
                exists = true;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return exists;
    }

    /**
     * 获取日期
     *
     * @return 例: 20210506
     */
    public static String getToDay() {
        SimpleDateFormat formatter = new SimpleDateFormat("yyyyddMM");
        return formatter.format(System.currentTimeMillis());
    }
}

PS:如果在第二步的配置文件是自己的定义的话、需要在@Value注解修改成和配置文件对应的