SpringBoot整合Minio的过程(支持公有及私有bucket)

 更新时间:2025年03月27日 10:11:18   作者:一恍过去  
Bucket 是存储Object的逻辑空间,每个Bucket之间的数据是相互隔离的,对用户而言,相当于存放文件的顶层文件夹,这篇文章主要介绍了SpringBoot整合Minio的过程(支持公有及私有bucket),需要的朋友可以参考下

1、Bucket、Object

  • Bucket 是存储Object的逻辑空间,每个Bucket之间的数据是相互隔离的,对用户而言,相当于存放文件的顶层文件夹;
  • Object 是存储到MinIO的基本对象,对用户而言,相当于文件;

2、常用API

  • bucketExists():用于检查指定的存储桶是否存在,返回布尔值,表示存储桶是否存在;
  • makeBucket():用于创建一个新的存储桶(bucket),需要指定存储桶的名称;
  • listBuckets():用于列出用户有权访问的所有存储桶,返回存储桶的列表;
  • removeBucket():用于删除一个已存在的存储桶(bucket),删除失败会抛出异常;
  • putObject():用于上传文件到指定的存储桶;
  • statObject():用于检查指定的对象(文件)的状态,判断是否存在;
  • getPresignedObjectUrl():用于生成一个对象(文件)的签名URL,以便可以通过HTTP访问;
  • getObject():用于从指定的存储桶中下载文件;
  • listObjects():用于列出指定存储桶中的所有对象(文件);
  • removeObject():用于删除指定存储桶中的对象,需要指定存储桶名称和对象键;

3、整合SpringBoot

引入POM包:

    <dependencies>
		<!-- minio -->
        <dependency>
            <groupId>io.minio</groupId>
            <artifactId>minio</artifactId>
            <version>8.5.9</version>
        </dependency>
	</dependencies>

3.1、yaml配置

minio:
  # 连接地址
  endpoint: http://127.0.0.1:9000
  # 用户名
  accessKey: admin
  # 密码
  secretKey: 123456789
  # 设置共有桶,具体名称可以在MinIo后台设置,可以直接访问,格式:http://1ip:port/bucketName/fileName
  publicBucket: public-test
  # 设置私有桶,具体名称可以在MinIo后台设置,需要通过getPresignedObjectUrl方法获取签名链接
  privateBucket: private-test

3.2、MinIo配置

MinIOInfoConfig:

@Data
@Component
@ConfigurationProperties(prefix = "minio")
public class MinIOInfoConfig {
    /**
     * 连接地址
     */
    private String endpoint;
    /**
     * 用户名
     */
    private String accessKey;
    /**
     * 密码
     */
    private String secretKey;
    /**
     * 私有bucket
     */
    private String privateBucket;
    /**
     * 公共bucket
     */
    private String publicBucket;
}

MinioConfig:

import io.minio.MinioClient;
import jakarta.annotation.Resource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MinioConfig {
    @Resource
    private MinIOInfoConfig minIOInfoConfig;
    @Bean
    public MinioClient minioClient() {
        //链式编程,构建MinioClient对象
        return MinioClient.builder()
                .endpoint(minIOInfoConfig.getEndpoint())
                .credentials(minIOInfoConfig.getAccessKey(), minIOInfoConfig.getSecretKey())
                .build();
    }
}

3.3、Bucket 操作

上传文件前,需要先进行Bucket 的创建操作,可以直接到MinIo后台进行创建,也可以通过API接口进行创建,代码示例如下

@Service
public class MinIOService {
    @Resource
    private MinioClient minioClient;
    public void bucket() {
        try {
            String bucketName = "test-bucket";
            // 判断是否存在
            boolean bucketExists = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());
            System.out.println("bucketExists1 = " + bucketExists);
            // 创建
            minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());
            // 再次判断
            bucketExists = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());
            System.out.println("bucketExists2 = " + bucketExists);
            // 查询列表
            List<Bucket> bucketList = minioClient.listBuckets();
            List<String> list = bucketList.stream().map(Bucket::name).toList();
            System.out.println("bucketList = " + list);
            // 删除
            minioClient.removeBucket(RemoveBucketArgs.builder().bucket(bucketName).build());
            // 再次判断
            bucketExists = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());
            System.out.println("bucketExists3 = " + bucketExists);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

3.4、Object操作

1. 上传文件

@Service
public class MinIOService {
    @Resource
    private MinioClient minioClient;
    @Resource
    private MinIOInfoConfig minIOInfoConfig;
        public void upload(MultipartFile file) {
        try {
            String originalFilename = file.getOriginalFilename();
            // 上传文件
            minioClient.putObject(PutObjectArgs.builder()
                    .bucket(minIOInfoConfig.getPrivateBucket())
                    .object(originalFilename)
                    .stream(file.getInputStream(), file.getSize(), -1)
                    .build()
            );
            // 判断文件是否存在
            // 获取访问地址
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

2、获取文件状态(是否存在)

@Service
public class MinIOService {
    @Resource
    private MinioClient minioClient;
    @Resource
    private MinIOInfoConfig minIOInfoConfig;
    public void fileState(String fileName) {
        try {
            StatObjectResponse response = minioClient.statObject(StatObjectArgs.builder()
                    .bucket(minIOInfoConfig.getPrivateBucket())
                    .object(fileName)
                    .build());
            System.out.println("response = " + response);
        } catch (Exception e) {
            log.error("文件不存在");
        }
    }
}

3、生成带签名公共访问连接

1、通过getPresignedObjectUrl方法,生成一个带到期时间、签名的URL,这个地址可以提供给没有登录的第三方共享访问或者上传对象,针对于Bucket为私有的情况。

2、对于共有的的文件,可以通过http://1ip:port/bucketName/fileName格式直接访问。

@Service
public class MinIOService {
    @Resource
    private MinioClient minioClient;
    @Resource
    private MinIOInfoConfig minIOInfoConfig;
    public String getPresignedObjectUrl(String fileName) {
        try {
            String presignedObjectUrl = minioClient.getPresignedObjectUrl(GetPresignedObjectUrlArgs.builder()
                    .bucket(minIOInfoConfig.getPrivateBucket())
                    .object(fileName)
                    // 设置过期时间,3分钟
                    .expiry(3, TimeUnit.MINUTES)
                    .method(Method.GET)
                    .build());
            System.out.println(presignedObjectUrl);
            return presignedObjectUrl;
        } catch (Exception e) {
            return "获取链接失败";
        }
    }
}

4、下载文件流

1、通过getObject()方法可以直接获取文件流,将文件流通过浏览器直接下;

2、使用该方式的好处是,在业务上可以由前端传入文件Id,服务端通过文件Id查询到文件名称再调用MinIO的API接口获取文件流,这样可以实现系统自身对文件的水平权限管理。

@Service
public class MinIOService {
    @Resource
    private MinioClient minioClient;
    @Resource
    private MinIOInfoConfig minIOInfoConfig;
    public void getObjectByStream(String fileName, HttpServletResponse response) {
        try {
            GetObjectResponse getObjectResponse = minioClient.getObject(GetObjectArgs.builder()
                    .bucket(minIOInfoConfig.getPrivateBucket())
                    .object(fileName)
                    .build());
            // 转化为流
            getObjectResponse.transferTo(response.getOutputStream());
        } catch (Exception e) {
            log.error("获取文件失败");
        }
    }
}

5、获取文件列表

@Service
public class MinIOService {
    @Resource
    private MinioClient minioClient;
    @Resource
    private MinIOInfoConfig minIOInfoConfig;
    public void listObjects() {
        try {
            Iterable<Result<Item>> listObjects = minioClient.listObjects(ListObjectsArgs.builder()
                    .bucket(minIOInfoConfig.getPrivateBucket())
                    // 以xx开头的文件名称
                    // .prefix("/")
                    .build());
            listObjects.forEach(itemResult -> {
                try {
                    Item item = itemResult.get();
                    log.info("文件名称:" + item.objectName());
                } catch (Exception e) {
                    throw new RuntimeException(e);
                }
            });
        } catch (Exception e) {
            log.error("获取文件失败");
        }
    }
}

6、删除文件信息

@Service
public class MinIOService {
    @Resource
    private MinioClient minioClient;
    @Resource
    private MinIOInfoConfig minIOInfoConfig;
    public void removeObject(String fileName) {
        try {
            // 单个删除
            minioClient.removeObject(RemoveObjectArgs.builder()
                    .bucket(minIOInfoConfig.getPrivateBucket())
                    .object(fileName)
                    .build());
            // 批量删除
            List<DeleteObject> list = new ArrayList<>();
            list.add(new DeleteObject(fileName));
            minioClient.removeObjects(RemoveObjectsArgs.builder()
                    .bucket(minIOInfoConfig.getPrivateBucket())
                    .objects(list)
                    .build());
        } catch (Exception e) {
            log.error("删除文件失败");
        }
    }
}

到此这篇关于SpringBoot整合Minio(支持公有及私有bucket)的文章就介绍到这了,更多相关SpringBoot整合Minio内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringMVC方法返回值多种情况代码实例

    SpringMVC方法返回值多种情况代码实例

    这篇文章主要介绍了SpringMVC方法返回值多种情况代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • 关于@Autowired注解爆红的原因分析及解决过程

    关于@Autowired注解爆红的原因分析及解决过程

    这篇文章主要介绍了关于@Autowired注解爆红的原因分析及解决过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-06-06
  • Java8中Stream使用的一个注意事项

    Java8中Stream使用的一个注意事项

    最近在工作中发现了对于集合操作转换的神器,java8新特性 stream,但在使用中遇到了一个非常重要的注意点,所以这篇文章主要给大家介绍了关于Java8中Stream使用过程中的一个注意事项,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧。
    2017-11-11
  • SpringBoot记录Http请求日志的方法

    SpringBoot记录Http请求日志的方法

    这篇文章主要介绍了SpringBoot记录Http请求日志的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-03-03
  • jboss配置方法简明教程

    jboss配置方法简明教程

    这篇文章主要介绍了jboss配置方法,较为简明扼要的说明了jboss服务器所需要的JDK环境安装设置以及jboss的安装与下载,并分析了配置与使用中的常见问题,需要的朋友可以参考下
    2016-08-08
  • 浅谈spring中用到的设计模式及应用场景

    浅谈spring中用到的设计模式及应用场景

    下面小编就为大家带来一篇浅谈spring中用到的设计模式及应用场景。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • mac系统如何下载和安装jdk的三种方式

    mac系统如何下载和安装jdk的三种方式

    这篇文章主要介绍了mac系统下载和安装jdk的三种方式,每种方法都有其特点,如安装来源及可靠性、安装过程及便捷性、版本管理及切换、环境配置、jdk默认安装路径以及占用空间及资源管理等,需要的朋友可以参考下
    2025-01-01
  • SpringBoot 如何使用RestTemplate发送Post请求

    SpringBoot 如何使用RestTemplate发送Post请求

    这篇文章主要介绍了SpringBoot 如何使用RestTemplate发送Post请求的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • Java中BeanUtils.copyProperties基本用法与小坑

    Java中BeanUtils.copyProperties基本用法与小坑

    本文主要介绍了Java中BeanUtils.copyProperties基本用法与小坑,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • springboot集成测试里的redis

    springboot集成测试里的redis

    这篇文章主要介绍了springboot集成测试里的redis,本文给大家分享了源码,添加依赖添加mock的方法,需要的朋友可以参考下
    2018-11-11

最新评论