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());}}}

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

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

相关文章

【Windows 常用工具系列 14 -- windows 网络驱动映射】

文章目录 windows 网络驱动映射 windows 网络驱动映射 映射网络驱动器的意思是将局域网中的某个目录映射成本地驱动器号。 在windows上将服务器目录映射到本地盘&#xff1a; 进入到服务器执行下面命令既可以看到对应的 IP地址&#xff1a; 将对应的IP地址填入上图中。 映…

Synchronized(三:JVM中锁的优化)

简单来说在JVM中的monitorenter和monitorexit字节码依赖于底层的操作系统的Mutex Lock来实现的&#xff0c;但是由于使用Mutex Lock需要将当前线程挂起并从用户态切换到内核态来执行&#xff0c;这种切换的代价是非常昂贵的&#xff1b;然而在现实中大部分情况下&#xff0c;同…

C++ Floyd求最短路 Floyd算法(多源汇最短路)

给定一个 n 个点 m 条边的有向图&#xff0c;图中可能存在重边和自环&#xff0c;边权可能为负数。 再给定 k 个询问&#xff0c;每个询问包含两个整数 x 和 y &#xff0c;表示查询从点 x 到点 y 的最短距离&#xff0c;如果路径不存在&#xff0c;则输出 impossible。 数据…

docker部署前后端分离项目

docker部署前后端分离项目 前提&#xff0c;服务器环境是docker环境&#xff0c;如果服务器没有安装docker&#xff0c;可以先安装docker环境。 各个环境安装docker&#xff1a; Ubuntu上安装Docker&#xff1a; ubuntu离线安装docker: CentOS7离线安装Docker&#xff1a; Cen…

类与对象-对象特性

师从黑马程序员 对象的初始化和清理 构造函数和析构函数 用于完成对象的初始化和清理工作 如果我们不提供构造和析构&#xff0c;编译器会提供编译器提供的构造函数和析构函数是空实现 构造函数&#xff1a;主要用于创建对象时为对象的成员属性赋值&#xff0c;构造函数由编…

什么是机器视觉?

什么是机器视觉 近年来&#xff0c;人工智能渐渐成为一个热点话题。作为人工智能领域的一个分支&#xff0c;图像处理技术也随之发展到了一个新的高度&#xff0c;各种新的软件工具、算法库、开源资料不断涌现&#xff0c;各行各业也渐渐开始进行技术变革。比较典型的例子是&a…

运维常见的工具

当谈到DevOps时&#xff0c;有许多工具可用于自动化、协作和监控软件开发和运维过程。收集整理了以下DevOps常见的工具及其简介&#xff1a; 版本控制&#xff1a;Git - 分布式版本控制系统&#xff0c;用于协作开发和追踪代码变更。 持续集成&#xff1a;Jenkins - 开源自动…

【论文笔记】Gemma: Open Models Based on Gemini Research and Technology

Gemma 日期: March 5, 2024 平台: CSDN, 知乎 状态: Writing Gemma: Open Models Based on Gemini Research and Technology 谷歌最近放出的Gemma模型【模型名字来源于拉丁文gemma&#xff0c;意为宝石】采用的是与先前Gemini相同的架构。这次谷歌开源了两个规模的模型&…

Android抓包--不走代理的请求Proxy.NO_PROXY,过代理检测,burpsuite+Postern

网上很多不走代理检测的抓包都是charles + Postern 或 charles + Postern + burpsuite,本文使用burpsuite+Postern。 使用无代理 Proxy.NO_PROXY 访问网络接口原理 在Android开发中,大部分的App的网络请求都是基于charles 和 fiddler 来进行抓包的,对网络客户端使用无代理模…

【2024】vue-router和pinia的配置使用

目录 vue-routerpiniavue-routerpinia进阶用法---动态路由 有同学在项目初始化后没有下载vue-router和pinia&#xff0c;下面开始&#xff1a; vue-router npm install vue-router然后在src目录下创建文件夹router&#xff0c;以及下面的index.ts文件&#xff1a; 写进下面的…

短剧小程序:掌中剧院,随时上演

在繁忙的生活节奏中&#xff0c;我们总渴望找到一片属于自己的休闲空间。短剧小程序&#xff0c;就是这样一处随时随地都能让你沉浸其中的掌上剧院。无论你在何处&#xff0c;无论何时&#xff0c;只要轻轻一点&#xff0c;精彩纷呈的短剧即刻上演。 一、掌中剧院&#xff0c;…

学习Java的第二天

如何使用文本文档在cmd里打印出HelloWorld 1、创建一个文本文档&#xff0c;并命名为HelloWorld&#xff0c;将后缀改为java&#xff08;需要自己去把后缀打开显示出来&#xff09; 2、打开编辑 也可以双击打开 3、在里面写出以下代码 上面红框里为你要打印的语句&#xff0c;…

MySql、Navicat 软件安装 + Navicat简单操作(建数据库,表)

一、MySql、Navicat 软件安装 及正常使用 MySql下载&#xff0b;安装&#xff1a; 检查安装情况&#xff1a; 配置环境变量&#xff1a; 搞定了&#xff01;&#xff01;&#xff01; 可以登陆试哈哈哈 连接navicat 开始创建数据库 二、 商品种类表 - commoditytype int …

【C++】102.二叉树的层序遍历

题目描述 给你二叉树的根节点 root &#xff0c;返回其节点值的 层序遍历 。 &#xff08;即逐层地&#xff0c;从左到右访问所有节点&#xff09;。 示例1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;[[3],[9,20],[15,7]]示例 2&#xff1…

leetcode230. 二叉搜索树中第K小的元素

lletcode 230. 二叉搜索树中第K小的元素&#xff0c;链接&#xff1a;https://leetcode.cn/problems/kth-smallest-element-in-a-bst 题目描述 给定一个二叉搜索树的根节点 root &#xff0c;和一个整数 k &#xff0c;请你设计一个算法查找其中第 k 个最小元素&#xff08;从 …

自学Java的第二十一天(在学校版)

一&#xff0c;每日收获 类与对象 1.看一个养猫猫问题 2.使用现有技术解决 Object01.java 3.类与对象的关系示意图 4.快速入门 5.类和对象的区别和联系 6.对象在内存中存在形式 7.属性/成员变量/字段 8.如何创建对象 9.如何访问属性 二&#xff0c;新名词与小技巧 三…

【Linux】Linux网络故障排查与解决指南

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a;Linux ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 正文 检查网络连接状态&#xff1a; 检查路由表&#xff1a; 检查DNS配置&#xff1a; 检查网络连接状态&#xff1a; 检查防火墙设…

JavaScript | 【讨论】微软早在2022年已经停用ie的今天,js开发还需要考虑ie9以下的情况嘛?

CSDN的C知道机器回复&#xff1a; 在进行JavaScript开发时&#xff0c;通常需要考虑IE9以下的况。尽管IE9以下的浏览器在市场份额上逐渐减少&#xff0c;但仍然有一部分用户在使用这些旧版本的浏览器。为了确保网站或应用在这些浏览器上能够正常运行&#xff0c;以下是一些需要…

Igraph入门指南 2

3、图的基本要素——边(Edge|Arc) 图的最本质的内容是一种二元关系&#xff0c;如果给这种二元关系赋予一个方向&#xff0c;就产生了有向图和无向图的分类&#xff0c;在教材中&#xff0c;无向的边叫Edge&#xff0c;有向的边叫Arc&#xff0c;另外&#xff0c;根据两个顶点…

【C++】贪心算法

贪心算法&#xff08;Greedy Algorithm&#xff09;是一种基于贪心策略的算法&#xff0c;它在每一步选择中都采取当前状态下最优的选择&#xff0c;以希望最终得到全局最优解。贪心算法通常适用于满足最优子结构性质的问题&#xff0c;即问题的最优解可以通过其子问题的最优解…