SpringBoot 整合 minio 进行文件上传

本文介绍如何通过配置和代码实现MinIO对象存储服务的集成,包括添加依赖、配置属性、创建客户端实例及上传文件等操作。

1、添加minio依赖

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

2、添加配置文件

3、配置文件导入

import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;

@Data
@Configuration
public class MinIoConfig {
    /**
     * minIoUrl
     */
    @Value("${config.minIo.url}")
    private String minIoUrl;

    /**
     * minIoAccessKey
     */
    @Value("${config.minIo.accessKey}")
    private String minIoAccessKey;

    /**
     * minIoSecretKey
     */
    @Value("${config.minIo.secretKey}")
    private String minIoSecretKey;

    /**
     * minIoBucketName
     */
    @Value("${config.minIo.minIoBucketName}")
    private String minIoBucketName;


}

4、创建实例工厂

import io.minio.BucketExistsArgs;
import io.minio.MakeBucketArgs;
import io.minio.MinioClient;
import lombok.extern.slf4j.Slf4j;

import java.util.Objects;
import java.util.concurrent.ConcurrentHashMap;


@Slf4j
public final class MinIoFactory {
    private static MinIoConfig minIoConfig;

    static {
        MinIoFactory.minIoConfig = (MinIoConfig) SpringContextUtils.getBean("minIoConfig");
    }

    private static final ConcurrentHashMap<String, MinioClient> MINIO_CLIENT = new ConcurrentHashMap<>();

    /**
     * 获取minIoClient实例
     *
     * @return MinioClient
     */
    public static MinioClient getMinIoClient() {
        MinioClient minioClient = MINIO_CLIENT.get(minIoConfig.getMinIoBucketName());
        if (Objects.isNull(minioClient)) {
            try {
                log.info("MinIo实例开始初始化");
                minioClient = MinioClient.builder().endpoint(minIoConfig.getMinIoUrl())
                        .credentials(minIoConfig.getMinIoAccessKey(), minIoConfig.getMinIoSecretKey()).build();
                final boolean isExist = minioClient.bucketExists(BucketExistsArgs.builder().bucket(minIoConfig.getMinIoBucketName()).build());
                if (!isExist) {
                    minioClient.makeBucket(MakeBucketArgs.builder().bucket(minIoConfig.getMinIoBucketName()).build());
                }
                MINIO_CLIENT.put(minIoConfig.getMinIoBucketName(), minioClient);
                log.info("MinIo实例初始化成功");
            } catch (Exception e) {
                e.printStackTrace();
                log.error("MinIo实例初始化失败: {}", e.fillInStackTrace());
            }
        }
        return minioClient;
    }

    /**
     * 获取桶名称
     *
     * @return String
     */
    public static String getBucketName() {
        return minIoConfig.getMinIoBucketName();
    }

}

 

5、 创建工具类


import io.minio.GetPresignedObjectUrlArgs;
import io.minio.MinioClient;
import io.minio.PutObjectArgs;
import io.minio.http.Method;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.multipart.MultipartFile;

import java.io.InputStream;


@Slf4j
public class MinIoUtil {
    /**
     * 声音文件默认保存五年
     */
    private static final int DEFAULT_EXPIRY_TIME = 5 * 365 * 24 * 3600;


    /**
     * 上传文件
     *
     * @param file 上传文件
     * @return String
     */
    @SneakyThrows(Exception.class)
    public static String upload(MultipartFile file) {
        final MinioClient minIoClient = MinIoFactory.getMinIoClient();
        final String bucketName = MinIoFactory.getBucketName();
        final InputStream inputStream = file.getInputStream();
        final String fileName = file.getOriginalFilename();
        minIoClient.putObject(PutObjectArgs.builder().bucket(bucketName).object(fileName).stream(
                inputStream, file.getSize(), -1)
                .contentType(file.getContentType())
                .build());
        inputStream.close();
        return getFileUrl(bucketName, fileName, minIoClient);
    }

    /**
     * 获取minio文件的下载地址
     *
     * @param bucketName: 桶名
     * @param fileName:   文件名
     * @param minioClient minio实例对象
     * @return: String
     */
    @SneakyThrows(Exception.class)
    public static String getFileUrl(String bucketName, String fileName, MinioClient minioClient) {
        return minioClient.getPresignedObjectUrl(GetPresignedObjectUrlArgs.builder()
                .method(Method.DELETE)
                .bucket(bucketName)
                .object(fileName)
                .expiry(DEFAULT_EXPIRY_TIME)
                .build());
    }


}

6、由于minio文件默认有效期为7天

为了让路由地址长期有效,可以将桶的下载策略设置为public

mc policy set public minio/mybucket
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值