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,一经查实,立即删除!

相关文章

java多版本管理

一 java 多版本管理 使用 jenv, 地址&#xff1a;https://github.com/jenv/jenv mac 操作 brew install jenv# Shell: zsh echo export PATH"$HOME/.jenv/bin:$PATH" >> ~/.zshrc echo eval "$(jenv init -)" >> ~/.zshrc source ~/.zshrc需要…

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

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

关于app爬虫的环境准备

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

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

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

YAML 快速上手

文章目录 1.语法2.历史版本3.数据结构对象数组复合结构标量 4.引用5.文本块6.显示指定类型7.单文件多文档8.解析9.完整示例参考文献 YAML&#xff08;YAML Ain’t a Markup Language&#xff09;是专门用来写配置文件的语言&#xff0c;简洁强大&#xff0c;相比于 JSON 和 XML…

R包开发详细教程

开发一个R包可以帮助你组织和共享代码。以下是一个详细的步骤教程&#xff0c;介绍如何开发一个R包。 步骤 1: 准备工作 确保你已经安装了以下R包&#xff1a; install.packages("devtools") install.packages("roxygen2") install.packages("test…

[机器学习算法]决策树

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

基于深度学习的图像压缩

基于深度学习的图像压缩 图像压缩是指将图像数据量减小的同时尽量保留其视觉质量的过程。传统的图像压缩方法&#xff08;如JPEG、PNG等&#xff09;已经广泛应用&#xff0c;但随着深度学习技术的发展&#xff0c;基于深度学习的图像压缩方法逐渐显现出其优越性。以下是一些关…

【AI原理解析】— Kimi模型

目录 一、技术背景与基础 二、核心技术特点 深度学习与神经网络&#xff1a; 超长上下文学习&#xff1a; 多模态对齐&#xff1a; 个性化调优&#xff1a; 知识增强&#xff1a; 推理优化&#xff1a; 三、模型架构 一、技术背景与基础 Kimi模型是一种基于深度学习和…

enum库

Python enum 模块教程 enum 是 Python 3.4 引入的一个模块&#xff0c;用于定义枚举类型。枚举类型是一种特殊的数据类型&#xff0c;由一组命名的值组成&#xff0c;这些值称为枚举成员。使用 enum 可以提高代码的可读性和可维护性&#xff0c;特别是在处理一组相关的常量值时…

Laravel 的事件监听器与服务提供者和服务容器的二三事

一. Laravel 的事件监听器与服务提供者和服务容器有密切的关系。 服务提供者用于注册服务、绑定依赖关系以及执行框架的初始化设置。在服务提供者的 register 方法中&#xff0c;可以注册事件和事件监听器。 服务容器则负责管理对象的创建和依赖注入。事件监听器通常会被注册…

人工智能和机器学习的应用日益广泛,在医疗健康领域的具体应用是什么?

人工智能&#xff08;AI&#xff09;和机器学习&#xff08;ML&#xff09;在医疗健康领域的应用日益广泛&#xff0c;涵盖了从疾病预测、辅助诊断、药物研发到健康管理等多个方面。以下是一些具体的应用实例和成功案例&#xff1a; 疾病预测与辅助诊断&#xff1a;机器学习算…

实现Spring Boot中多数据源配置的解决方案

&#x1f341; 作者&#xff1a;知识浅谈&#xff0c;CSDN签约讲师&#xff0c;CSDN博客专家&#xff0c;华为云云享专家&#xff0c;阿里云专家博主 &#x1f4cc; 擅长领域&#xff1a;全栈工程师、爬虫、ACM算法 &#x1f525; 微信&#xff1a;zsqtcyw 联系我领取学习资料 …

python实现进度条的方法和实现代码

在Python中&#xff0c;有多种方式可以实现进度条。这里&#xff0c;我将介绍七种常见的方法&#xff1a;使用tqdm&#xff08;这是一个外部库&#xff0c;非常流行且易于使用&#xff09;、rich、click、progressbar2等库以及纯Python的print函数与time库来模拟进度条。 目录…

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

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

Spring Boot 项目中的如何序列化日期格式字符串(对象转JSON的日期字符串格式)

在Spring Boot 项目中, 将Bean序列化为一个JSON字符串的时候, 对于日期类型的属性, 可以直接在属性上使用@JsonFormat即可达成, 但是如果属性本身就是一个日期的字符串, 要输出为另外格式字符串要如何实现呢? @JsonFormat 转换 Timestamp 类型的属性 @JsonFormat注…

linux系统中,pwd获取当前路径,dirname获取上一层路径;不使用 ../获取上一层路径

在实际项目中&#xff0c;我们通常可以使用 pwd 来获取当前路径&#xff0c;但是如果需要获取上一层路径&#xff0c;有不想使用 …/ 的方式&#xff0c;可以尝试使用 dirname指令 测试shell脚本 #!/bin/bash# 获取当前路径 CURRENT_PATH$PWD echo "CURRENT_PATH$CURREN…

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

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

【Ruby简单脚本01】查看wifi密码

脚本 # 使用io库 def get_cmd_result(cmd) IO.popen(cmd,:external_encoding>GBK).read.encode("utf-8") end def list_wifi wifi_pwds Hash.new # 获取所有wifi文件 o1 get_cmd_result("netsh wlan show profiles") # 获取所有匹配结果 …

Linux操作系统学习:day05

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