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

😊 @ 作者: 一恍过去
💖 @ 主页: https://blog.csdn.net/zhuocailing3390
🎊 @ 社区: Java技术栈交流
🎉 @ 主题: SpringBoot整合Minio(支持公有及私有bucket)
⏱️ @ 创作时间: 2024年06月19日

目录

  • 1、Bucket、Object
  • 2、常用API
  • 3、整合SpringBoot
    • 3.1、yaml配置
    • 3.2、MinIo配置
    • 3.3、Bucket 操作
    • 3.4、Object操作
      • 1. 上传文件
      • 2、获取文件状态(是否存在)
      • 3、生成带签名公共访问连接
      • 4、下载文件流
      • 5、获取文件列表
      • 6、删除文件信息

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/fileNamepublicBucket: 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 {@Resourceprivate MinIOInfoConfig minIOInfoConfig;@Beanpublic 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 {@Resourceprivate 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 {@Resourceprivate MinioClient minioClient;@Resourceprivate 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 {@Resourceprivate MinioClient minioClient;@Resourceprivate 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 {@Resourceprivate MinioClient minioClient;@Resourceprivate 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 {@Resourceprivate MinioClient minioClient;@Resourceprivate 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 {@Resourceprivate MinioClient minioClient;@Resourceprivate 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 {@Resourceprivate MinioClient minioClient;@Resourceprivate 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("删除文件失败");}}
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/30250.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

张大哥笔记:如何选择一个人就值得做的副业

很多人喜欢把上班称为主业&#xff0c;把上班之外的工作称为副业&#xff0c;不管以哪种方式称呼都可以&#xff0c;只要能赚钱就行&#xff0c;上班的本质就是出卖时间&#xff0c;不管你是月入5000还是月入2万&#xff0c;都是给老板打工&#xff01; 但搞笑的就是月入2万的人…

关于app爬虫的环境准备

摘要 有些数据需要在手机应用中才能查看&#xff0c;没有网页版&#xff0c;所以学习移动端的爬虫是有必要的。 手机系统分为安卓和苹果两大系统&#xff0c;本次讲解主要以安卓手机为例 有安卓手机的可以使用手机&#xff0c;没有的可以使用模拟器&#xff0c;本次以夜神模…

基于C++、MFC和Windows套接字实现的简单聊天室程序开发

一、一个简单的聊天室程序 该程序由服务器端和客户端两个项目组成&#xff0c;这两个项目均基于对话框的程序。服务器端项目负责管理客户端的上线、离线状态&#xff0c;以及转发客户端发送的信息。客户端项目则负责向服务器发送信息&#xff0c;并接收来自服务器的信息&#…

[机器学习算法]决策树

1. 理解决策树的基本概念 决策树是一种监督学习算法&#xff0c;可以用于分类和回归任务。决策树通过一系列规则将数据划分为不同的类别或值。树的每个节点表示一个特征&#xff0c;节点之间的分支表示特征的可能取值&#xff0c;叶节点表示分类或回归结果。 2. 决策树的构建…

《STM32 HAL库》小米微电机控制例程——通信协议分析及驱动库

之前有段时间因为机器狗项目的缘故&#xff0c;一直在使用小米微电机&#xff0c;但是苦于没有一个详尽的奶妈级教程&#xff0c;在控制电机的学习中踩了不少的坑。今天咱们就从头至尾一步一步的实现使用按键控制小米微电机。本文将会分析小米电机驱动库&#xff0c;并简要介绍…

练手代码之使用Python实现合并PDF文件

如果你有合并PDF的需要&#xff0c;你会怎么办 我们无所不能的程序员会选择写一个Python代码来实现&#xff08;谁会这么无聊&#xff1f;是我&#xff09;&#xff0c;如果真的有PDF操作需要&#xff0c;我推荐你使用PDF Expert这个软件哈~ 话不多说直接上代码&#xff1a; …

Linux操作系统学习:day05

内容来自&#xff1a;Linux介绍 视频推荐&#xff1a;[Linux基础入门教程-linux命令-vim-gcc/g -动态库/静态库 -makefile-gdb调试]( 目录 day0530、删除用户31、添加和删除用户组创建用户组删除用户组 32、修改密码33、使用tar工具进行压缩和解压缩压缩解压缩 34、使用zip u…

增强大型语言模型(LLM)可访问性:深入探究在单块AMD GPU上通过QLoRA微调Llama 2的过程

Enhancing LLM Accessibility: A Deep Dive into QLoRA Through Fine-tuning Llama 2 on a single AMD GPU — ROCm Blogs 基于之前的博客《使用LoRA微调Llama 2》的内容&#xff0c;我们深入研究了一种称为量化低秩调整&#xff08;QLoRA&#xff09;的参数高效微调&#xff0…

单片机第五季-第八课:STM32CubeMx和FreeRTOS

1&#xff0c;FreeRTOS背景介绍 RTOS简介&#xff1a; 实时操作系统&#xff0c;本用于追求实时性的嵌入式系统&#xff0c;典型&#xff1a;ucos/uclinux/vxworks&#xff1b; 特点&#xff1a;中断响应快、一般可嵌套中断、使用实地址、多任务&#xff1b; &#xff08;实…

Qt6视频播放器项目框架代码

视频播放的关键代码如下: 使用Qt6的QMediaPlayer,QVideoWidget实现 void FunnyWidget::initVideo() {player = new QMediaPlayer(this);videoWidget = new QVideoWidget(this);playButton = new QPushButton("Play", this);pauseButton = new QPushButton("…

项目的打包

一:打包到微信小程序 1)vscode打包 2)在微信小程序开发工具中打开路径,上传. 疑问:为什么pnpm bulid:mp-weixin用于打包,pnpm dev:mp-weixin也可生成对应路径下的文件?? 打包的是没有热重载,且打包体积更小. 二:条件编译 vscode可以打包成能在不同平台上运行的代码.但是有…

404、左叶子之和

题解&#xff1a;可以采用后序递归遍历的方式&#xff0c;先将左右子树的左叶子节点值计算出来&#xff0c;最后相加。 当遍历到左叶子节点的父节点时就开始处理&#xff0c;将左叶子节点的值记录下来。 代码如下&#xff1a; class Solution { public:int sumOfLeftLeaves(…

算法金 | 再见!!!梯度下降(多图)

大侠幸会&#xff0c;在下全网同名「算法金」 0 基础转 AI 上岸&#xff0c;多个算法赛 Top 「日更万日&#xff0c;让更多人享受智能乐趣」 接前天 李沐&#xff1a;用随机梯度下降来优化人生&#xff01; 今天把达叔 6 脉神剑给佩奇了&#xff0c;上 吴恩达&#xff1a;机器…

利用 Qwen-VL 进行私有化部署第一个 AI 多模态大模型

Hi~&#xff01;这里是奋斗的小羊&#xff0c;很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~~ &#x1f4a5;&#x1f4a5;个人主页&#xff1a;奋斗的小羊 &#x1f4a5;&#x1f4a5;所属专栏&#xff1a;C语言 &#x1f680;本系列文章为个人学习…

【profinet】从站开发要点

目录 0、常见缩写及关键字注释 1、profinet简介 2、profinet协议栈 3、profinet数据帧 4、profinet网络解决方案示例 5、Application areas 注&#xff1a;本文主要简述profinet从站开发涉及到的知识点。【不足之处后续慢慢补充】。 0、常见缩写及关键字注释 MRP: Media…

Spring中IOC容器

IoC IOC容器 IoC是一种设计思想&#xff0c;面向对象编程 Spring通过IoC管理所有Java对象的实例化和初始化&#xff0c;控制对象之间依赖关系 将IoC容器管理的Java对象称为Spring Bean&#xff0c;与new创建的对象没有区别 控制反转&#xff08;IoC Inversion of Controle&a…

宏观必读:数智化、气候能源、多极化趋势并存,如何获得转型性增长?

关键词速读&#xff1a; 双转型——创新主导的 “新质生产力”正加速推动中国产业的数字化和绿色低碳“双转型”。 双引擎——企业借助“技术创新”和“生态创新”两大引擎&#xff0c;乘势而上&#xff0c;赢得未来机遇。 生成式 AI 与大模型爆发式发展正在引发计算、开发、交…

《Linux运维总结:prometheus+altermanager+webhook-dingtalk配置文件详解》

总结&#xff1a;整理不易&#xff0c;如果对你有帮助&#xff0c;可否点赞关注一下&#xff1f; 更多详细内容请参考&#xff1a;《Linux运维篇&#xff1a;Linux系统运维指南》 一、prometheus配置文件 Prometheus的配置文件是prometheus.yml&#xff0c;在启动时指定相关的…

对于补码的个人理解

1. 十进制的取模计算 现在我想要使另一个数加上2后用8取模后也等于1&#xff0c;这个数可以是哪些&#xff1f; 这个问题比较简单&#xff0c;只需要-1加上8的倍数即可 例如&#xff1a; 如果我们想要得到距离-1这个负数最近的一个正数7&#xff0c;直接使用-18即可。反过来想…