springboot如何快速接入minio对象存储
1.在项目中添加 Minio 的依赖,在使用 Minio 之前,需要在项目中添加 Minio 的依赖。可以在 Maven 的 pom.xml 文件中添加以下依赖:
<dependency><groupId>io.minio</groupId><artifactId>minio</artifactId><version>7.0.2</version>
</dependency>
2.在项目的配置文件中,添加minio服务器相关信息,这里使用的是application.yml文件:
minio:host: http://mini0.dl.cn:9000url: ${minio.host}/${minio.bucket}/access-key: *** #minio服务器上的access-keysecret-key: *** #minio服务器上的secret-keybucket: *** #需要使用的桶的名称
3.在项目中编写一个名为 MinioConfig.java 的配置类,用于加载 application.yml文件中的minio配置信息,并初始化 Minio 的客户端,使用 Minio 客户端进行相关操作,例如上传文件、下载文件、删除文件等。
@Component
public class MinioConfig implements InitializingBean {@Value(value = "${minio.bucket}")private String bucket;@Value(value = "${minio.host}")private String host;@Value(value = "${minio.url}")private String url;@Value(value = "${minio.access-key}")private String accessKey;@Value(value = "${minio.secret-key}")private String secretKey;private MinioClient minioClient;@Overridepublic void afterPropertiesSet() throws Exception {Assert.hasText(url, "Minio url 为空");Assert.hasText(accessKey, "Minio accessKey为空");Assert.hasText(secretKey, "Minio secretKey为空");this.minioClient = new MinioClient(this.host, this.accessKey, this.secretKey);}/*** 上传*/public String putObject(MultipartFile multipartFile) throws Exception {// bucket 不存在,创建if (!minioClient.bucketExists(this.bucket)) {minioClient.makeBucket(this.bucket);}try (InputStream inputStream = multipartFile.getInputStream()) {// 上传文件的名称String fileName = multipartFile.getOriginalFilename();// PutObjectOptions,上传配置(文件大小,内存中文件分片大小)PutObjectOptions putObjectOptions = new PutObjectOptions(multipartFile.getSize(), PutObjectOptions.MIN_MULTIPART_SIZE);// 文件的ContentTypeputObjectOptions.setContentType(multipartFile.getContentType());minioClient.putObject(this.bucket, fileName, inputStream, putObjectOptions);// 返回访问路径return this.url + UriUtils.encode(fileName, StandardCharsets.UTF_8);}}/*** 文件下载*/public void download(String fileName, HttpServletResponse response){// 从链接中得到文件名InputStream inputStream;try {MinioClient minioClient = new MinioClient(host, accessKey, secretKey);ObjectStat stat = minioClient.statObject(bucket, fileName);System.out.println("stat = " + stat);inputStream = minioClient.getObject(bucket, fileName);response.setContentType(stat.contentType());response.setCharacterEncoding("UTF-8");response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));IOUtils.copy(inputStream, response.getOutputStream());inputStream.close();} catch (Exception e){e.printStackTrace();System.out.println("有异常:" + e);}}/*** 列出所有存储桶名称** @return* @throws Exception*/public List<String> listBucketNames()throws Exception {List<Bucket> bucketList = listBuckets();List<String> bucketListName = new ArrayList<>();for (Bucket bucket : bucketList) {bucketListName.add(bucket.name());}return bucketListName;}/*** 查看所有桶** @return* @throws Exception*/public List<Bucket> listBuckets()throws Exception {return minioClient.listBuckets();}/*** 检查存储桶是否存在** @param bucketName* @return* @throws Exception*/public boolean bucketExists(String bucketName) throws Exception {boolean flag = minioClient.bucketExists(bucketName);if (flag) {return true;}return false;}/*** 创建存储桶** @param bucketName* @return* @throws Exception*/public boolean makeBucket(String bucketName)throws Exception {boolean flag = bucketExists(bucketName);if (!flag) {minioClient.makeBucket(bucketName);return true;} else {return false;}}/*** 删除桶** @param bucketName* @return* @throws Exception*/public boolean removeBucket(String bucketName)throws Exception {boolean flag = bucketExists(bucketName);if (flag) {Iterable<Result<Item>> myObjects = listObjects(bucketName);for (Result<Item> result : myObjects) {Item item = result.get();// 有对象文件,则删除失败if (item.size() > 0) {return false;}}// 删除存储桶,注意,只有存储桶为空时才能删除成功。minioClient.removeBucket(bucketName);flag = bucketExists(bucketName);if (!flag) {return true;}}return false;}/*** 列出存储桶中的所有对象** @param bucketName 存储桶名称* @return* @throws Exception*/public Iterable<Result<Item>> listObjects(String bucketName) throws Exception {boolean flag = bucketExists(bucketName);if (flag) {return minioClient.listObjects(bucketName);}return null;}/*** 列出存储桶中的所有对象名称** @param bucketName 存储桶名称* @return* @throws Exception*/public List<String> listObjectNames(String bucketName) throws Exception {List<String> listObjectNames = new ArrayList<>();boolean flag = bucketExists(bucketName);if (flag) {Iterable<Result<Item>> myObjects = listObjects(bucketName);for (Result<Item> result : myObjects) {Item item = result.get();listObjectNames.add(item.objectName());}}return listObjectNames;}/*** 删除一个对象** @param bucketName 存储桶名称* @param objectName 存储桶里的对象名称* @throws Exception*/public boolean removeObject(String bucketName, String objectName) throws Exception {boolean flag = bucketExists(bucketName);if (flag) {List<String> objectList = listObjectNames(bucketName);for (String s : objectList) {if(s.equals(objectName)){minioClient.removeObject(bucketName, objectName);return true;}}}return false;}/*** 文件访问路径** @param bucketName 存储桶名称* @param objectName 存储桶里的对象名称* @return* @throws Exception*/public String getObjectUrl(String bucketName, String objectName) throws Exception {boolean flag = bucketExists(bucketName);String url = "";if (flag) {url = minioClient.getObjectUrl(bucketName, objectName);}return url;}}
4.创建MinioController.java类,处理文件上传,下载,桶创建,删除等操作。
RestController
@RequestMapping("minio")
@Slf4j
public class MinioController {@AutowiredMinioConfig minioConfig;// 上传@PostMapping("/upload")public Object upload(@RequestParam("file") MultipartFile multipartFile) throws Exception {return this.minioConfig.putObject(multipartFile);}//下载@GetMapping("/download")public void download(@RequestParam("fileName")String fileName, HttpServletResponse response) { this.minioConfig.download(fileName,response);}// 列出所有存储桶名称@PostMapping("/list")public List<String> list() throws Exception {return this.minioConfig.listBucketNames();}// 创建存储桶@PostMapping("/createBucket")public boolean createBucket(String bucketName) throws Exception {return this.minioConfig.makeBucket(bucketName);}// 删除存储桶@PostMapping("/deleteBucket")public boolean deleteBucket(String bucketName) throws Exception {return this.minioConfig.removeBucket(bucketName);}// 列出存储桶中的所有对象名称@PostMapping("/listObjectNames")public List<String> listObjectNames(String bucketName) throws Exception {return this.minioConfig.listObjectNames(bucketName);}// 删除一个对象@PostMapping("/removeObject")public boolean removeObject(String bucketName, String objectName) throws Exception {return this.minioConfig.removeObject(bucketName, objectName);}// 文件访问路径@PostMapping("/getObjectUrl")public String getObjectUrl(String bucketName, String objectName) throws Exception {return this.minioConfig.getObjectUrl(bucketName, objectName);}
}
5.测试
相关文章:
springboot如何快速接入minio对象存储
1.在项目中添加 Minio 的依赖,在使用 Minio 之前,需要在项目中添加 Minio 的依赖。可以在 Maven 的 pom.xml 文件中添加以下依赖: <dependency><groupId>io.minio</groupId><artifactId>minio</artifactId>&l…...
第六届“智能设计+运维”国产工业软件研讨会暨2024年天洑软件用户大会圆满召开
2024年5月23-24日,第六届“智能设计运维”国产工业软件研讨会暨2024年天洑软件用户大会在南京举办。来自国产工业软件研发企业、制造业企业、高校、科研院所的业内大咖,能源动力、船舶海事、车辆运载、航空航天、新能源汽车、动力电池、消费电子、石油石…...
05.k8s弹性伸缩
5.k8s弹性伸缩 k8s弹性伸缩,需要附加插件heapster监控 弹性伸缩:随着业务访问量的大小,k8s系统中的pod比较弹性,会自动增加或者减少pod数量; 5.1 安装heapster监控 1:上传并导入镜像,打标签 ls *.tar.gz for n in ls *.tar.gz…...
【数据结构】详解二叉树
文章目录 1.树的结构及概念1.1树的概念1.2树的相关结构概念1.3树的表示1.4树在实际中的应用 2.二叉树的结构及概念2.1二叉树的概念2.2特殊的二叉树2.2.1满二叉树2.2.2完全二叉树 2.3 二叉树的性质2.4二叉树的存储结构2.4.1顺序结构2.4.2链表结构 1.树的结构及概念 1.1树的概念…...
MapDB:轻量级、高性能的Java嵌入式数据库引擎
MapDB:轻量级、高性能的Java嵌入式数据库引擎 在今天的软件开发中,嵌入式数据库因其轻便、高效和易于集成而备受欢迎。对于Java开发者来说,MapDB无疑是一个值得关注的选项。MapDB是一个纯Java编写的嵌入式数据库引擎,它提供了高性…...
Rye: 一个革新的Python包管理工具
文章目录 Rye: 一个革新的Python包管理工具Rye的诞生背景Rye的核心特性Rye的安装与使用Rye的优势与挑战Rye的未来展望结语 Rye: 一个革新的Python包管理工具 在Python生态系统中,包管理一直是一个复杂且令人头疼的问题。随着Python社区的不断发展,出现了…...
如何在C#代码中判断当前C#的版本和dotnet版本
代码如下: using System.Reflection; using System.Runtime.InteropServices;var csharpVersion typeof(string).Assembly.GetCustomAttributes(typeof(AssemblyFileVersionAttribute), false).OfType<AssemblyFileVersionAttribute>().FirstOrDefault()?.…...
Linux 36.3@Jetson Orin Nano之系统安装
Linux 36.3Jetson Orin Nano之系统安装 1. 源由2. 命令行烧录Step 1:下载Linux 36.3安装程序Step 2:下载Linux 36.3根文件系统Step 3:解压Linux 36.3安装程序Step 4:解压Linux 36.3根文件系统Step 5:安装应用程序Step …...
案例实践 | 基于长安链的首钢供应链金融科技服务平台
案例名称-首钢供应链金融科技服务平台 ■ 建设单位 首惠产业金融服务集团有限公司 ■ 用户群体 核心企业、资金方(多为银行)等合作方 ■ 应用成效 三大业务场景,共计关联29个业务节点,覆盖京票项目全部关键业务 案例背景…...
Vue3实战笔记(55)—Vue3.4新特性揭秘:defineModel重塑v-model,拥抱高效双向数据流!
文章目录 前言defineModel() 基本用法总结 前言 v-model 可以在组件上使用以实现双向绑定。 从 Vue 3.4 开始,推荐的实现方式是使用 defineModel() 宏 defineModel() 基本用法 定义defineModel(): <!-- Child.vue --> <script setup> con…...
C++ | Leetcode C++题解之第123题买卖股票的最佳时机III
题目: 题解: class Solution { public:int maxProfit(vector<int>& prices) {int n prices.size();int buy1 -prices[0], sell1 0;int buy2 -prices[0], sell2 0;for (int i 1; i < n; i) {buy1 max(buy1, -prices[i]);sell1 max(…...
微信小程序中Button组件的属性值和用法详解
在微信小程序开发中,Button组件是非常常用的UI组件之一,它可以让用户进行交互操作,比如提交表单、跳转页面等。了解Button组件的属性值和用法对于开发者来说至关重要。 1. Button组件简介 简要介绍Button组件在小程序中的作用和重要性&…...
等保测评 | 等保测评简介及流程具体是什么?
等保测评是指对信息系统进行安全性评估和测试,以确保其符合国家相关等级保护要求。在当前信息时代,各类机构和企业面临着日益严峻的网络安全风险,等保测评成为了保障信息系统安全的重要手段之一。本文将介绍等保测评的基本概念、流程和重要性…...
CompassArena 司南大模型测评--代码编写
测试角度 要说测试模型,对咱们程序员来说,那自然是写代码的能力强不强比较重要了。那么下面我们以 leetcode 中的一道表面上是困难题的题目来考考各家大模型,看看哪个才应该是咱们日常写程序的帮手。 部分模型回答 问题部分如下截图&#…...
叉积和法向量学习笔记
目录 叉积用的内积 相似点 给定平面上的两个向量 A 和 B,叉积和法向量相等吗 理解这点的关键: 结论: 叉积判断平面内两个向量是否相交 叉积(Cross Product)和法向量(Normal Vector)确实有…...
YZW900规格书
title: “深圳市沃进科技有限公司” 深圳市沃进科技有限公司 TOP视图 特性 异地组网,远程访问有线/无线备份单模双卡备份5G转有线,5G转WIFI2.4G5.8G双频WIFI三网口,WAN/LAN可切换软硬件看门狗智能防掉线云平台、客户端远程管理安装支架安装铝…...
9岁学生学什么编程好一些:探索编程启蒙的奥秘
9岁学生学什么编程好一些:探索编程启蒙的奥秘 在数字时代,编程已逐渐成为一项基本技能。对于9岁的学生来说,选择适合的编程课程或平台,对于培养逻辑思维、创新思维以及解决问题的能力至关重要。那么,9岁学生学什么编程…...
Java反射实战指南:反射机制的终极指南
1. 反射机制简介 在Java中,反射机制提供了一种强大的工具,用于在运行时检查类、接口、字段和方法。但它的重要性不止于此,它允许程序动态加载、探索和使用编译时完全未知的代码。这种能力是Java语言支持的一种“动态”特性,使得J…...
高效训练超越LoRA,北航发布MoRA
什么!LoRA我都没有学懂,又出现了MoRA??? LoRA作为当下最火热的大语言模型参数高效微调技术,正在以前所未有的速度迭代更新。从最初的LoRA到陆续推出的LoRA、DoRA、AsyLoRA等变体,LoRA家族可谓是…...
【Spring】Spring之依赖注入源码解析(上)
目录 Spring中到底有几种依赖注入的方式? 手动注入 自动注入 XML的autowire自动注入 Autowired注解的自动注入 寻找注入点 桥接方法 注入点进行注入 字段注入 Set方法注入 Spring中到底有几种依赖注入的方式? 首先分两种: 手动注…...
基于Uniapp开发HarmonyOS 5.0旅游应用技术实践
一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架,支持"一次开发,多端部署",可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务,为旅游应用带来…...
django filter 统计数量 按属性去重
在Django中,如果你想要根据某个属性对查询集进行去重并统计数量,你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求: 方法1:使用annotate()和Count 假设你有一个模型Item,并且你想…...
Python爬虫(一):爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...
什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南
文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果
一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...
腾讯云V3签名
想要接入腾讯云的Api,必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口,但总是卡在签名这一步,最后放弃选择SDK,这次终于自己代码实现。 可能腾讯云翻新了接口文档,现在阅读起来,清晰了很多&…...
LRU 缓存机制详解与实现(Java版) + 力扣解决
📌 LRU 缓存机制详解与实现(Java版) 一、📖 问题背景 在日常开发中,我们经常会使用 缓存(Cache) 来提升性能。但由于内存有限,缓存不可能无限增长,于是需要策略决定&am…...
系统掌握PyTorch:图解张量、Autograd、DataLoader、nn.Module与实战模型
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文通过代码驱动的方式,系统讲解PyTorch核心概念和实战技巧,涵盖张量操作、自动微分、数据加载、模型构建和训练全流程&#…...
LCTF液晶可调谐滤波器在多光谱相机捕捉无人机目标检测中的作用
中达瑞和自2005年成立以来,一直在光谱成像领域深度钻研和发展,始终致力于研发高性能、高可靠性的光谱成像相机,为科研院校提供更优的产品和服务。在《低空背景下无人机目标的光谱特征研究及目标检测应用》这篇论文中提到中达瑞和 LCTF 作为多…...
鸿蒙HarmonyOS 5军旗小游戏实现指南
1. 项目概述 本军旗小游戏基于鸿蒙HarmonyOS 5开发,采用DevEco Studio实现,包含完整的游戏逻辑和UI界面。 2. 项目结构 /src/main/java/com/example/militarychess/├── MainAbilitySlice.java // 主界面├── GameView.java // 游戏核…...
