当前位置: 代码网 > it编程>编程语言>Java > SpringBoot整合Minio的过程(支持公有及私有bucket)

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

2025年03月27日 Java 我要评论
1、bucket、objectbucket 是存储object的逻辑空间,每个bucket之间的数据是相互隔离的,对用户而言,相当于存放文件的顶层文件夹;object 是存储到minio的基本对象,对

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内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com