springboot项目整合minio实现文件的分布式存储
minio是一款分布式存储系统,上一篇详细介绍了minio在windows环境下的搭建集群并通过nginx实现负载均衡,这里简单介绍下springboot项目整合minio并实现文件的上传下载删除等操作。
一、依赖的引入
1.1、maven项目
<dependency><groupId>io.minio</groupId><artifactId>minio</artifactId><version>8.3.0</version>
</dependency>
1.2、普通项目
普通项目采用手动引入jar包方式会挺麻烦的,推荐使用maven来引入依赖
普通项目使用minio需要引入jar包大致包括minio-8.3.0.jar ; okio-2.5.0.jar ; okhttp-4.8.1.jar ; guava-22.0.jar
二、minio配置类
@Configuration
@Slf4j
public class MinioConfig {@Value("${minio.endpoint}")private String endpoint;@Value("${minio.accessKey}")private String accessKey;@Value("${minio.secretKey}")private String secretKey;@Value("${minio.bucketName}")private String bucketName;@Beanpublic MinioClient minioClient(){MinioClient minioClient = MinioClient.builder().endpoint(endpoint).credentials(accessKey, secretKey).build();try {boolean found = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());if(!found){minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());log.info("minio初始化桶:"+bucketName);}} catch (Exception e) {log.error(e.getMessage());}return minioClient;}
}
其中四个变量为application.yml中的配置,MinioConfig.java配置文件创建了minio分布式存储系统的操作客户端minioClient并交给springboot进行管理,且创建了名为java-bucket的桶。
# 分布式存储minio相关配置
minio:# 分布式存储的服务地址,要做集群的话则是通过nginx配置负载均衡,该地址指向nginx入口endpoint: http://127.0.0.1:9001# 分布式存储系统对应的用户名和密码accessKey: minioadminsecretKey: minioadmin# 所有文件均存储在该名称对应的桶中bucketName: java-bucket
三、通过minioClient操作文件
@Component
public class minioUtil{private static MinioClient minioClient;private static String bucketName;// 由于静态方法中只能用静态变量,而静态变量无法直接实现注入,为此通过非静态的set方法注入值@Value("${minio.bucketName}")public void setBucketName(String bucketName) {fileUtils.bucketName = bucketName;}@Autowiredpublic void setMinioClient(MinioClient minioClient) {fileUtils.minioClient = minioClient;}// 将本地文件夹整个上传至minio存储系统,其中dirName表示上传的文件夹路径如 C:/admin/testDir ,len表示对源路径的截取长度,使其上传至minio存储系统保持相对路径,比如C:/admin/testDir/test.txt 截取成 admin/testDir/test.txtpublic static void minio_uploadFile(String dirName,int len){List<String> filePathList = new ArrayList<>();File file = new File(dirName);minio_recursionGetFileList(file,filePathList);for (String s : filePathList) {minio_uploadSingleFile(s.substring(len,s.length()),s);}}// 递归获取parentFile文件夹下的所有文件目录private static void minio_recursionGetFileList(File parentFile, List<String> filePathList) {File[] files = parentFile.listFiles();for (File file : files) {if(file.isFile()){filePathList.add(file.getPath());}else {minio_recursionGetFileList(file,filePathList);}}}// 本地单个文件的上传public static void minio_uploadSingleFile(String objectName,String fileName){objectName = objectName.replace("\\","/");// 上传文件try {minioClient.uploadObject(UploadObjectArgs.builder().bucket(bucketName).object(objectName) // 上传到分布式系统的文件名称.filename(fileName) // 本地文件路径.build());} catch (Exception e) {throw new RuntimeException(e);}}// 删除minio存储系统bucketName桶中文件// objectName为要删除的文件名,如要删除b文件夹下的test.txt,则objectName应为"b/test.txt"private static void minio_deleteFile(String objectName){try {minioClient.removeObject(RemoveObjectArgs.builder().bucket(bucketName).object(objectName).build());} catch (Exception e) {log.error("删除minio中文件出现错误:"+e.getMessage());}}// minio存储系统中下载objectName的文件到fileName,如下载objectName = "b/test.txt" , fileName = "C:/test1.txt"private static void minio_downloadFile(String objectName,String fileName){try {minioClient.downloadObject(DownloadObjectArgs.builder().bucket(bucketName).object(objectName).filename(fileName).build());} catch (Exception e) {log.info("下载minio文件出现错误:"+e.getMessage());}}// 获取minio的bucketName桶的所有文件列表private static void minio_getFileList(){// 获取文件列表Iterable<Result<Item>> results = minioClient.listObjects(ListObjectsArgs.builder().bucket(bucketName).build());Iterator<Result<Item>> iterator = results.iterator();List<Object> items = new ArrayList<>();String format = "{'fileName':'%s','fileSize':'%s'}";try {while (iterator.hasNext()){Item item = iterator.next().get();System.out.println(item.objectName());System.out.println(item.size());}} catch (Exception e) {log.error("获取minio中文件列表出错:"+e.getMessage());}}/*** @description 多文件上传至minio系统*/public static void uploadToMinio(List<MultipartFile> multipartFiles,String dir) {for (int i = 0; i < multipartFiles.size(); i++) {minio_uploadFile(multipartFiles.get(i),multipartFiles.get(i).getName(),dir);}}private static void minio_uploadFile(MultipartFile file,String objectName,String dir){try {InputStream inputStream = file.getInputStream();minioClient.putObject(PutObjectArgs.builder().bucket(bucketName).object(dir+"/"+objectName).contentType(file.getContentType()).stream(inputStream, inputStream.available(), -1).build());} catch (Exception e) {log.error("文件上传至minio出错:"+e.getMessage());}}// 将minio存储系统中整个dir目录全部删除public static void deleteDirFromMinio(String dir){try {Iterable<Result<Item>> results = minioClient.listObjects(ListObjectsArgs.builder().bucket(bucketName).delimiter(dir).prefix(dir+"/").build());for (Result<Item> itemResult : results) {Item item = itemResult.get();minioClient.removeObject(RemoveObjectArgs.builder().bucket(bucketName).object(item.objectName()).build());}} catch (Exception e) {log.error("删除minio中文件出现错误:"+e.getMessage());}}}
相关文章:
springboot项目整合minio实现文件的分布式存储
minio是一款分布式存储系统,上一篇详细介绍了minio在windows环境下的搭建集群并通过nginx实现负载均衡,这里简单介绍下springboot项目整合minio并实现文件的上传下载删除等操作。 一、依赖的引入 1.1、maven项目 <dependency><groupId>io…...
微信小程序开发学习笔记《19》uni-app框架-配置小程序分包与轮播图跳转
微信小程序开发学习笔记《19》uni-app框架-配置小程序分包与轮播图跳转 博主正在学习微信小程序开发,希望记录自己学习过程同时与广大网友共同学习讨论。建议仔细阅读uni-app对应官方文档 一、配置小程序分包 分包可以减少小程序首次启动时的加载时间 为此&#…...
Python内置模块
目录 什么是模块 模块分类 通过模块创建者分类 系统内置模块 第三方模块 在线安装 离线安装 模块导入 math和random模块介绍 math模块 random模块 什么是模块 在我们编写程序时,需要导入包。例如随机数的产生,需要import random。import XXX&…...
WordPress建站入门教程:小皮面板phpstudy如何安装PHP和切换php版本?
小皮面板phpstudy支持的PHP版本有很多,包括5.2.17、5.3.29、5.4.45、5.5.9、5.6.9、7.0.9、7.1.9、7.2.9、7.3.4、7.3.9、7.4.3、8.0.2、8.2.9。那么我们如何安装其他的php版本和切换网站的php版本呢?只需要简单几步即可,具体如下:…...
用友 NC saveDoc.ajax 任意文件上传漏洞复现
0x01 产品简介 用友NC是一款企业级ERP软件。作为一种信息化管理工具,用友NC提供了一系列业务管理模块,包括财务会计、采购管理、销售管理、物料管理、生产计划和人力资源管理等,帮助企业实现数字化转型和高效管理。 0x02 漏洞概述 用友 NC saveDoc.ajax接口处存在任意文件…...
如何使用达摩盘
目录 1.定义 2.功能:圈人群、画像洞察、同步到站内渠道投放; 1.定义 是阿里妈妈基于商业化营销场景打造的人群精细化运营定向中台,涵盖消费行为、兴趣偏好、地理位置等海量数据标签,为商家提供个性化人群圈选,识别店…...
网络编程的学习
思维导图 多路复用代码练习 select完成TCP并发服务器 #include<myhead.h> #define SER_IP "192.168.125.73" //服务器IP #define SER_PORT 8888 //服务器端口号int main(int argc, const char *argv[]) {//1、创建用于监听的套接字int sfd -1;s…...
【Mining Data】收集数据(使用 Python 挖掘 Twitter 数据)
@[TOC](【Mining Data】收集数据(使用 Python 挖掘 Twitter 数据)) 具体步骤 第一步是注册您的应用程序。特别是,您需要将浏览器指向 http://apps.twitter.com,登录 Twitter(如果您尚未登录)并注册新应用程序。您现在可以为您的应用程序选择名称和描述(例如“Mining Demo”…...
2024京津冀光伏展
2024年京津冀光伏展是一个专门展示京津冀地区光伏产业发展情况的展览会。光伏产业是指利用太阳能进行发电的产业,它在可再生能源领域具有重要的地位。京津冀地区是中国重要的经济区域,也是光伏产业的发展热点地区之一。 2024年京津冀光伏展将展示京津冀地…...
在C#中使用Linq
在C#中使用Linq 前言一、基本查询操作二、高级查询操作三、数据库查询四、文件和 XML 查询五、总结 前言 LINQ(Language Integrated Query)是 C# 中一种强大的查询语言集成特性,它使得在编程语言级别对数据进行查询和操作变得更加简单和直观…...
Swing程序设计(11)动作事件监听器,焦点事件监听器
文章目录 前言一、事件监听器是什么?二、详细展开 1.动作事件监听器2.焦点事件监听器总结 前言 如果你是坚持从Swing程序第一篇看到了这里,恭喜你,Swing程序设计简单地落下了帷幕,关于Swing程序更深的了解,可以自行学习…...
Python 开发图形界面程序
用 Python 语言开发图形界面的程序,有2种选择: Tkinter 基于Tk的Python库,这是Python官方采用的标准库,优点是作为Python标准库、稳定、发布程序较小,缺点是控件相对较少。 PySide2/PySide6 基于Qt 的Python库&#x…...
百度搜索引擎SEO优化方法
随着互联网的不断发展,搜索引擎已经成为人们获取信息、产品和服务的主要途径之一。而在中国,百度作为最大的搜索引擎,其影响力不可忽视。了解并掌握百度SEO关键词优化方法,对于提升网站在搜索引擎中的排名至关重要。 关键词选择&a…...
一文了解docker与k8s
随着 k8s 作为容器编排解决方案变得越来越流行,有些人开始拿 Docker 和 k8s 进行对比,不禁问道:Docker 不香吗? k8s 是 kubernetes 的缩写,8 代表中间的八个字符。 其实 Docker 和 k8s 并非直接的竞争对手两者相互依存…...
Linux基础——进程控制
1. 进程创建 在这之前我们曾了解过进程创建(详见进程初识(二)),我们在这里对fork函数做一些补充 其实对于父子进程来说,若是有一方试图修改数据时,会向物理内存中申请一份新空间,并…...
网络工程师笔记8
华为VRP系统 设备管理方式 web管理方式 命令行管理方式 修改命令:undo 基础配置命令...
从零学算法128
128.给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。 请你设计并实现时间复杂度为 O(n) 的算法解决此问题。 示例 1: 输入:nums [100,4,200,1,3,2] 输出:4…...
2024免费mac苹果电脑的清理和维护软件CleanMyMac X
对于 Mac 用户来说,电脑的清理和维护是一件让人头疼的事情。但是,有了 CleanMyMac X,这一切都将变得轻松愉快。CleanMyMac X 是一款专为 Mac 设计的电脑清理软件,它以其强大的功能和简单的操作,让无数用户为之倾倒。 C…...
Python反射机制在实际场景中的应用
Python 的反射机制是指在运行时动态地访问、检测和修改类和对象的属性和方法。反射为开发者提供了一种灵活的方式来处理对象和类,可以在实际场景中提供一些有用的功能和应用,下面是 Python 反射在实际场景中的一些常见应用: 插件系统…...
网络原理初识
一、IP地址 概念 IP 地址主要用于标识网络主机、其他网络设备(如路由器)的网络地址。简单说, IP 地址用于定位主机 的网络地址 。 就像我们发送快递一样,需要知道对方的收货地址,快递员才能将包裹送到目的地。 二、…...
春季2021亚马逊研究奖获奖者公布
春季 2021 某机构研究奖获奖者公布 2021年7月,某机构通知申请人已成为2021年春季某机构研究奖的获得者。该奖项旨在为跨多个学科领域开展研究课题的学术研究人员提供无限制资金和某云平台服务积分。今天,我们正式公布26位获奖者,他们来自11个…...
原创:行业空白:从约束崩塌到系统闭环的工程新论
行业空白:从约束崩塌到系统闭环的工程新论 作者:华夏之光永存 #工程约束 #底层架构 #系统稳定性 #软件开发 #高端制造 #工程方法论 #逻辑闭环 #零缺陷工程 #源头治理 #技术架构 摘要 本文直指当前工程领域普遍存在的核心问题:缺乏统一、刚性的…...
MT5 Zero-Shot参数详解:Temperature与Top-P对中文改写多样性的影响
MT5 Zero-Shot参数详解:Temperature与Top-P对中文改写多样性的影响 1. 项目概述 MT5 Zero-Shot Chinese Text Augmentation 是一个基于 Streamlit 和阿里达摩院 mT5 模型构建的本地化 NLP 工具。这个工具专门用于中文句子的语义改写和数据增强,能够在保…...
打造企业级 AI Agent:任务编排 + 多工具系统(Python 深度实战)
如果你已经写过简单的 AI Agent,你很快会遇到一个问题:❌ 能跑 Demo,但一到真实业务就崩为什么?因为你缺的不是模型,而是这三样东西:任务编排(Workflow)多工具系统(Tool …...
【西瓜带你学设计模式 | 第四期 - 抽象工厂模式】抽象工厂模式 —— 定义、核心结构、实战示例、优缺点与适用场景及模式区别
文章目录前言1. 抽象工厂模式是什么?2. 解决什么问题?2.1 有多个“产品维度”,并且需要成套切换2.2 变化点分散导致代码难维护3. 核心结构4. 示例4.1 抽象产品:Slice(切片)4.2 抽象产品:Pulp&am…...
Ostrakon-VL-8B LaTeX文档自动化:将手写公式草图转换为排版代码
Ostrakon-VL-8B LaTeX文档自动化:将手写公式草图转换为排版代码 每次写论文或者报告,最头疼的部分是什么?对我而言,绝对是敲那些复杂的LaTeX公式。一个积分符号、一个分式结构,往往要花上好几分钟去回忆语法、调整括号…...
Qwen2.5-VL-7B-Instruct开源大模型:支持中文优先的多模态理解部署方案
Qwen2.5-VL-7B-Instruct开源大模型:支持中文优先的多模态理解部署方案 1. 项目概述 Qwen2.5-VL-7B-Instruct是一款开源的视觉-语言多模态大模型,特别针对中文场景进行了优化。该模型能够同时处理图像和文本输入,实现跨模态的理解与生成任务…...
Typora与AI结合:使用万象熔炉·丹青幻境为Markdown文档自动配图
Typora与AI结合:使用万象熔炉丹青幻境为Markdown文档自动配图 不知道你有没有过这样的体验:在Typora里写完一篇技术博客或项目文档,内容详实,逻辑清晰,但通篇下来全是文字,总觉得少了点什么。想配几张图吧…...
Unity资源提取技术解密:AssetRipper效能革命与实战指南
Unity资源提取技术解密:AssetRipper效能革命与实战指南 【免费下载链接】AssetRipper GUI Application to work with engine assets, asset bundles, and serialized files 项目地址: https://gitcode.com/GitHub_Trending/as/AssetRipper 在游戏开发迭代加速…...
基于大数据技术的产品评价分析系统设计与实现
前言本研究聚焦于设计与实现一种基于大数据技术的产品评价分析系统,通过构建多层架构体系与融合多元技术方法,为企业决策提供智能化支撑。 研究采用分层架构设计理念,将系统划分为数据采集、存储、处理、分析与展示五大模块。数据采集层综合运…...
