引入Maven依赖

<dependency><groupId>io.minio</groupId><artifactId>minio</artifactId><version>8.3.0</version>
</dependency>

配置文件

spring:servlet:multipart:max-file-size: 379MB # 文件上传大小限制max-request-size: 379MB # 请求长度大小限制# Minio 属性配置
minio:accessKey: minio # Minio配置页面登录用户名secretKey: minio.* # Minio配置页面登录用户名密码bucket: buckename # Bucket文件夹名称endpoint: http://localhost:9000 # Minio配置页面地址 及 端口readPath: http://localhost:9000 # Minio文件上传路径地址 及 端口

Minio 属性配置类

@Data
@ConfigurationProperties(prefix = "minio")
public class MinioProperties {/*** Minio 登录用户名*/private String accessKey;/*** Minio 登录用户密码*/private String secretKey;/*** Minio 管理页面地址*/private String endpoint;/*** Minio 桶名称*/private String bucket;/*** Minio 文件访问地址*/private String readPath;
}

Springboot启动类

/*** 用户启动器** @author Chill*/
@EnableBladeFeign
@SpringCloudApplication
@ConditionalOnClass(MinioClient.class)
@Slf4j
public class ControlApplication {public static void main(String[] args) {BladeApplication.run(LauncherConstant.APPLICATION_CONTROL_NAME, ControlApplication.class, args);}@Resourceprivate MinioProperties minioAutoProperties;@Beanpublic MinioClient minioClient() {log.info("开始初始化MinioClient, url为{}, accessKey为:{}", minioAutoProperties.getUrl(), minioAutoProperties.getAccessKey());MinioClient minioClient = MinioClient.builder().endpoint(minioAutoProperties.getUrl()).credentials(minioAutoProperties.getAccessKey(), minioAutoProperties.getSecretKey()).build();minioClient.setTimeout(minioAutoProperties.getConnectTimeout(),minioAutoProperties.getWriteTimeout(),minioAutoProperties.getReadTimeout());// Start detectionif (minioAutoProperties.isCheckBucket()) {log.info("checkBucket为{}, 开始检测桶是否存在", minioAutoProperties.isCheckBucket());String bucketName = minioAutoProperties.getBucket();if (!checkBucket(bucketName, minioClient)) {log.info("文件桶[{}]不存在, 开始检查是否可以新建桶", bucketName);if (minioAutoProperties.isCreateBucket()) {log.info("createBucket为{},开始新建文件桶", minioAutoProperties.isCreateBucket());createBucket(bucketName, minioClient);}}log.info("文件桶[{}]已存在, minio客户端连接成功!", bucketName);} else {throw new RuntimeException("桶不存在, 请检查桶名称是否正确或者将checkBucket属性改为false");}return minioClient;}private boolean checkBucket(String bucketName, MinioClient minioClient) {boolean isExists = false;try {isExists = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());} catch (Exception e) {throw new RuntimeException("failed to check if the bucket exists", e);}return isExists;}private void createBucket(String bucketName, MinioClient minioClient) {try {minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());log.info("文件桶[{}]新建成功, minio客户端已连接", bucketName);} catch (Exception e) {throw new RuntimeException("failed to create default bucket", e);}}
}

Minio 工具类

package org.springblade.control.config;import io.minio.*;
import io.minio.messages.Bucket;
import io.minio.messages.Item;
import lombok.SneakyThrows;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;import javax.annotation.Resource;
import java.io.*;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import java.util.function.IntFunction;/*** Minio工具类** @author wh* @version 1.0.0*/
@Component
public class MinioUtils {@Resourceprivate MinioClient minioClient;@Resourceprivate MinioProperties minioProperties;/*** 判断桶是否存在** @param bucketName bucket名称* @return true存在,false不存在*/public Boolean bucketExists(String bucketName) {try {return minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());} catch (Exception e) {throw new RuntimeException("检查桶是否存在失败!", e);}}/*** 创建bucket** @param bucketName bucket名称*/public void createBucket(String bucketName) {if (!this.bucketExists(bucketName)) {try {minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());} catch (Exception e) {throw new RuntimeException("创建桶失败!", e);}}}/*** 上传MultipartFile文件到全局默认文件桶中** @param file 文件* @return 文件对应的URL*/public String putObject(MultipartFile file) {// 给文件名添加时间戳防止重复String fileName = getFileName(Objects.requireNonNull(file.getOriginalFilename()));// 开始上传this.putMultipartFile(minioProperties.getBucket(), fileName, file);return minioProperties.getUrl() + "/" + minioProperties.getBucket() + "/" + fileName;}/*** 上传文件** @param objectName  文件名* @param stream      文件流* @param contentType 文件类型, 例如 image/jpeg: jpg图片格式, 详细可看: https://www.runoob.com/http/http-content-type.html* @return 文件url*/public String putObject(String objectName, InputStream stream, String contentType) {// 给文件名添加时间戳防止重复String fileName = getFileName(objectName);// 开始上传this.putInputStream(minioProperties.getBucket(), fileName, stream, contentType);return minioProperties.getUrl() + "/" + minioProperties.getBucket() + "/" + fileName;}/*** 上传bytes文件** @param objectName  文件名* @param bytes       字节* @param contentType 文件类型, 例如 image/jpeg: jpg图片格式, 详细可看: https://www.runoob.com/http/http-content-type.html* @return 文件url*/public String putObject(String objectName, byte[] bytes, String contentType) {// 给文件名添加时间戳防止重复String fileName = getFileName(objectName);// 开始上传this.putBytes(minioProperties.getBucket(), fileName, bytes, contentType);return minioProperties.getUrl() + "/" + minioProperties.getBucket() + "/" + fileName;}/*** 上传MultipartFile文件到全局默认文件桶下的folder文件夹下** @param objectName 文件名称, 如果要带文件夹请用 / 分割, 例如 /help/index.html* @param file       文件* @return 文件对应的URL*/public String putObject(String objectName, MultipartFile file) {// 给文件名添加时间戳防止重复objectName = getFileName(objectName);// 开始上传this.putMultipartFile(minioProperties.getBucket(), objectName, file);return minioProperties.getUrl() + "/" + minioProperties.getBucket() + "/" + objectName;}/*** 上传MultipartFile文件到指定的文件桶下** @param bucketName 桶名称* @param objectName 文件名称, 如果要带文件夹请用 / 分割, 例如 /help/index.html* @param file       文件* @return 文件对应的URL*/public String putObject(String bucketName, String objectName, MultipartFile file) {// 先创建桶this.createBucket(bucketName);// 给文件名添加时间戳防止重复objectName = getFileName(objectName);// 开始上传this.putMultipartFile(bucketName, objectName, file);return minioProperties.getUrl() + "/" + bucketName + "/" + objectName;}/*** 上传流到指定的文件桶下** @param bucketName  桶名称* @param objectName  文件名称, 如果要带文件夹请用 / 分割, 例如 /help/index.html* @param stream      文件流* @param contentType 文件类型, 例如 image/jpeg: jpg图片格式, 详细可看: https://www.runoob.com/http/http-content-type.html* @return 文件对应的URL*/public String putObject(String bucketName, String objectName, InputStream stream, String contentType) {// 先创建桶this.createBucket(bucketName);// 给文件名添加时间戳防止重复String fileName = getFileName(objectName);// 开始上传this.putInputStream(bucketName, fileName, stream, contentType);return minioProperties.getUrl() + "/" + bucketName + "/" + fileName;}/*** 上传流到指定的文件桶下** @param bucketName  桶名称* @param objectName  文件名称, 如果要带文件夹请用 / 分割, 例如 /help/index.html* @param bytes       字节* @param contentType 文件类型, 例如 image/jpeg: jpg图片格式, 详细可看: https://www.runoob.com/http/http-content-type.html* @return 文件对应的URL*/public String putObject(String bucketName, String objectName, byte[] bytes, String contentType) {// 先创建桶this.createBucket(bucketName);// 给文件名添加时间戳防止重复String fileName = getFileName(objectName);// 开始上传this.putBytes(bucketName, fileName, bytes, contentType);return minioProperties.getUrl() + "/" + bucketName + "/" + fileName;}/*** 上传File文件到默认桶下** @param objectName  文件名* @param file        文件* @param contentType 文件类型, 例如 image/jpeg: jpg图片格式, 详细可看: https://www.runoob.com/http/http-content-type.html* @return 文件对应的URL*/public String putObject(String objectName, File file, String contentType) {// 给文件名添加时间戳防止重复String fileName = getFileName(objectName);// 开始上传this.putFile(minioProperties.getBucket(), fileName, file, contentType);return minioProperties.getUrl() + "/" + minioProperties.getBucket() + "/" + fileName;}/*** 上传File文件** @param bucketName  文件桶* @param objectName  文件名* @param file        文件* @param contentType 文件类型, 例如 image/jpeg: jpg图片格式, 详细可看: https://www.runoob.com/http/http-content-type.html* @return 文件对应的URL*/public String putObject(String bucketName, String objectName, File file, String contentType) {// 先创建桶this.createBucket(bucketName);// 给文件名添加时间戳防止重复String fileName = getFileName(objectName);// 开始上传this.putFile(bucketName, fileName, file, contentType);return minioProperties.getUrl() + "/" + bucketName + "/" + fileName;}/*** 判断文件是否存在** @param objectName 文件名称, 如果要带文件夹请用 / 分割, 例如 /help/index.html* @return true存在, 反之*/public Boolean checkFileIsExist(String objectName) {return this.checkFileIsExist(minioProperties.getBucket(), objectName);}/*** 判断文件夹是否存在** @param folderName 文件夹名称* @return true存在, 反之*/public Boolean checkFolderIsExist(String folderName) {return this.checkFolderIsExist(minioProperties.getBucket(), folderName);}/*** 判断文件是否存在** @param bucketName 桶名称* @param objectName 文件名称, 如果要带文件夹请用 / 分割, 例如 /help/index.html* @return true存在, 反之*/public Boolean checkFileIsExist(String bucketName, String objectName) {try {minioClient.statObject(StatObjectArgs.builder().bucket(bucketName).object(objectName).build());} catch (Exception e) {return false;}return true;}/*** 判断文件夹是否存在** @param bucketName 桶名称* @param folderName 文件夹名称* @return true存在, 反之*/public Boolean checkFolderIsExist(String bucketName, String folderName) {try {Iterable<Result<Item>> results = minioClient.listObjects(ListObjectsArgs.builder().bucket(bucketName).prefix(folderName).recursive(false).build());for (Result<Item> result : results) {Item item = result.get();if (item.isDir() && folderName.equals(item.objectName())) {return true;}}} catch (Exception e) {return false;}return true;}/*** 根据文件全路径获取文件流** @param objectName 文件名称* @return 文件流*/public InputStream getObject(String objectName) {return this.getObject(minioProperties.getBucket(), objectName);}/*** 根据文件桶和文件全路径获取文件流** @param bucketName 桶名称* @param objectName 文件名* @return 文件流*/public InputStream getObject(String bucketName, String objectName) {try {return minioClient.getObject(GetObjectArgs.builder().bucket(bucketName).object(objectName).build());} catch (Exception e) {throw new RuntimeException("根据文件名获取流失败!", e);}}/*** 根据url获取文件流** @param url 文件URL* @return 文件流*/public InputStream getObjectByUrl(String url) {try {return new URL(url).openStream();} catch (IOException e) {throw new RuntimeException("根据URL获取流失败!", e);}}/*** 获取全部bucket** @return 所有桶信息*/public List<Bucket> getAllBuckets() {try {return minioClient.listBuckets();} catch (Exception e) {throw new RuntimeException("获取全部存储桶失败!", e);}}/*** 根据bucketName获取信息** @param bucketName bucket名称* @return 单个桶信息*/public Optional<Bucket> getBucket(String bucketName) {try {return minioClient.listBuckets().stream().filter(b -> b.name().equals(bucketName)).findFirst();} catch (Exception e) {throw new RuntimeException("根据存储桶名称获取信息失败!", e);}}/*** 根据bucketName删除信息** @param bucketName bucket名称*/public void removeBucket(String bucketName) {try {minioClient.removeBucket(RemoveBucketArgs.builder().bucket(bucketName).build());} catch (Exception e) {throw new RuntimeException("根据存储桶名称删除桶失败!", e);}}/*** 删除文件** @param objectName 文件名称*/public boolean removeObject(String objectName) {try {this.removeObject(minioProperties.getBucket(), objectName);} catch (Exception e) {return false;}return true;}/*** 删除文件** @param bucketName bucket名称* @param objectName 文件名称*/public boolean removeObject(String bucketName, String objectName) {try {minioClient.removeObject(RemoveObjectArgs.builder().bucket(bucketName).object(objectName).build());} catch (Exception e) {return false;}return true;}/*** 上传MultipartFile通用方法** @param bucketName 桶名称* @param objectName 文件名* @param file       文件*/private void putMultipartFile(String bucketName, String objectName, MultipartFile file) {InputStream stream = null;try {stream = file.getInputStream();} catch (IOException e) {throw new RuntimeException("文件流获取错误", e);}try {minioClient.putObject(PutObjectArgs.builder().bucket(bucketName).object(objectName).contentType(file.getContentType()).stream(stream, stream.available(), -1).build());} catch (Exception e) {throw new RuntimeException("文件流上传错误", e);}}/*** 上传InputStream通用方法** @param bucketName 桶名称* @param objectName 文件名* @param stream     文件流*/private void putInputStream(String bucketName, String objectName, InputStream stream, String contentType) {try {minioClient.putObject(PutObjectArgs.builder().bucket(bucketName).object(objectName).contentType(contentType).stream(stream, stream.available(), -1).build());} catch (Exception e) {throw new RuntimeException("文件流上传错误", e);}}/*** 上传 bytes 通用方法** @param bucketName 桶名称* @param objectName 文件名* @param bytes      字节编码*/private void putBytes(String bucketName, String objectName, byte[] bytes, String contentType) {// 字节转文件流InputStream stream = new ByteArrayInputStream(bytes);try {minioClient.putObject(PutObjectArgs.builder().bucket(bucketName).object(objectName).contentType(contentType).stream(stream, stream.available(), -1).build());} catch (Exception e) {throw new RuntimeException("文件流上传错误", e);}}/*** 上传 file 通用方法** @param bucketName  桶名称* @param objectName  文件名* @param file        文件* @param contentType 文件类型, 例如 image/jpeg: jpg图片格式, 详细可看: https://www.runoob.com/http/http-content-type.html*/private void putFile(String bucketName, String objectName, File file, String contentType) {try {FileInputStream fileInputStream = new FileInputStream(file);minioClient.putObject(PutObjectArgs.builder().bucket(bucketName).object(objectName).contentType(contentType).stream(fileInputStream, fileInputStream.available(), -1).build());} catch (Exception e) {throw new RuntimeException("文件上传错误", e);}}/*** 生成唯一ID** @param objectName 文件名* @return 唯一ID*/private static String getFileName(String objectName) {//判断文件最后一个点所在的位置int lastIndexOf = objectName.lastIndexOf(".");if (lastIndexOf == -1) {return String.format("%s_%s", objectName, System.currentTimeMillis());} else {// 获取文件前缀,已最后一个点进行分割String filePrefix = objectName.substring(0, objectName.lastIndexOf("."));// 获取文件后缀,已最后一个点进行分割String fileSuffix = objectName.substring(objectName.lastIndexOf(".") + 1);// 组成唯一文件名return String.format("%s_%s.%s", filePrefix, System.currentTimeMillis(), fileSuffix);}}/*** 获取文件信息, 如果抛出异常则说明文件不存在** @param bucketName bucket名称* @param objectName 文件名称* @throws Exception https://docs.minio.io/cn/java-client-api-reference.html#statObject*/public StatObjectResponse getObjectInfo(String bucketName, String objectName) throws Exception {return minioClient.statObject(StatObjectArgs.builder().bucket(bucketName).object(objectName).build());}/*** 获取文件外链** @param bucketName bucket名称* @param objectName 文件名称* @param expires    过期时间 <=7* @return url*/@SneakyThrowspublic String getObjectURL(String bucketName, String objectName, Integer expires) {IntFunction<Integer> integerIntFunction = (int i) -> {return Math.min(i, 7);};return minioClient.getPresignedObjectUrl(GetPresignedObjectUrlArgs.builder().bucket(bucketName).object(objectName).expiry(integerIntFunction.apply(expires)).build());}/*** 根据文件前置查询文件** @param bucketName bucket名称* @param prefix     前缀* @param recursive  是否递归查询* @return MinioItem 列表*/@SneakyThrowspublic List<Item> getAllObjectsByPrefix(String bucketName, String prefix, boolean recursive) {List<Item> list = new ArrayList<>();Iterable<Result<Item>> objectsIterator = minioClient.listObjects(ListObjectsArgs.builder().bucket(bucketName).prefix(prefix).recursive(recursive).build());if (objectsIterator != null) {for (Result<Item> result : objectsIterator) {Item item = result.get();list.add(item);}}return list;}}

Minio Utils相关推荐

  1. SpringBoot集成Minio搭建自己的分布式文件服务器(Minio集成篇)

    目录 1.导入依赖 2.创建spring boot工程,工程名为springboot-minio 3.配置minio配置文件 4.创建配置类MinioConfig 5.创建Minio工具类MinioU ...

  2. MinIO实现分布式文件服务

    文章目录 什么是MinIO? 应用场景 特点 安装MinIO 获取镜像 启动镜像 图形界面操作 SpringBoot整合MinIO 获取accessKey和secretKey 添加依赖 添加配置 配置 ...

  3. java 文件打包下载

    话不多说,直接上代码 方法需要传入文件目录,比如想打包1目录下的2目录,同时2目录包含3和4目录,name就传入1目录就可以了 打包之后 /*** 文件打包下载** @param src 需要打包的文 ...

  4. minio服务器在win10的上传与下载,以及修改头像Minio速看免费本地文件服务器

    首先自己配置Minio服务器 和客户端 请点击 官网地址http://www.minio.org.cn 安装完成后自己百度win10安装. 我是用Spring boot 配置 首先导入 Minio D ...

  5. minio安装部署及使用

    一.服务器安装minio 1.进行下载 下载地址: GNU/Linux https://dl.min.io/server/minio/release/linux-amd64/minio 2.新建min ...

  6. MinIO纠错码、分布式MinIO集群搭建及启动

    文章目录 前言 一.MinIO纠删码 二.分布式集群部署 1.分布式存储可靠性常用的方法 2.分布式MinIO 3.分布式MinIO集群搭建 3.1 下载MinIO 3.2 为每一台虚拟机创建目录并上 ...

  7. (十六)admin-boot项目之文件存储上传与下载minio

    (十六)文件存储上传与下载 项目地址:https://gitee.com/springzb/admin-boot 如果觉得不错,给个 star 简介: 这是一个基础的企业级基础后端脚手架项目,主要由s ...

  8. springboot整合minio上传文件

    1.安装minio 这里采用docker进行安装. 搜索该镜像:docker search minio 找到了镜像:minio/minio 拉取镜像:docker pull minio/minio 启 ...

  9. 基于MinIO/Deleta Lake/Dremio和Superset或Metabase搭建简单的数据湖

    数据湖架构 大多数公司都有大量的业务数据,这些数据通常孤立在各种存储系统中,包括数据库和数据仓库.为了充分利用这些数据资产,您应该将数据集中并整合到统一的数据存储中,以增强分析能力. 通过数据湖架构, ...

最新文章

  1. 沈阳农业大学计算机往年录取分数6,沈阳农业大学历年分数线 2021沈阳农业大学录取分数线...
  2. [AS3 3D Demo] Stage3D学习过程中开发的3个Demo
  3. 用Vue来实现图片上传多种方式
  4. 【杂谈】从GitHub上星星最多的男人开始发GitHub综述资料
  5. Python第四章__装饰器、迭代器
  6. [WP] 关于页面切换动画 记录
  7. 专业的软件安装包可以这样做!
  8. hexo本地博客的转移
  9. SpringMVC的JSP页面中EL表达式不起作用${}
  10. 起搏器可以用计算机吗,带心脏起搏器能否使用电脑
  11. Minimum Size Subarray Sum 最短子数组之和
  12. 使用god来自动启动崩溃的进程
  13. 计算机科学现代教育,现代教育技术教程-计算机科学教育.pdf
  14. CSS z-index 属性 控制div上下层次
  15. 下载论文的tex模板
  16. 2G、3G无线路由器拨号连接过程
  17. python只保留大写字母_python 将文件中除保留字外的小写字母换成大写字母(转换后可运行)...
  18. 如何把扫描的PDF文件转换为Word文档?
  19. 【Leetcode】打气球的最大分数 (暴力递归+动态规划)
  20. 数据分析之北京房价复习

热门文章

  1. 基于matlab的产生式系统案例
  2. 二叉树的基本原理和性质(初学必看)
  3. python挂机脚本怎么运行,Python实现自动挂机脚本(基础篇)
  4. ElasticSearch 升级过程中给涉及到的术语-1、同步刷新synced  flush
  5. 数据分析软件解读王者荣耀一年的“王者”成绩单
  6. 【操作系统】DOS界面与常用操作命令
  7. 『腾讯会议』远程教学使用指南
  8. 中美跨境电商贸易投资云洽会成功举办;TT Shop和TTforBusiness将互通;PhonePe月破20亿...|洞悉跨境
  9. workbench动力学周炬_《ANSYS WORKBENCH有限元分析实例详解(动力学)》【价格 目录 书评 正版】_中国图书网...
  10. JavaScript中的扁平化数据转换为树形结构、树形结构扁平化数据