当前位置: 首页 > news >正文

Springboot整合minio组件-分布式文件存储

一、快速开始

Minlo说明:
  1. Minio是Apcche旗下的一款开源的轻量级文件服务器,基于对象存储,协议是基于Apache License v2.0,开源可用于商务。
  2. Minio主要用来存储非结构化的数据,类似文件,图片,照片,日志文件,各类备份文件等,按照官网描述,文件的大小从几KB到5TB。
  3. Minio提供了非常方便,友好的界面,并且文档也是非常丰富,具体可以参考它的文档:https://docs.min.io/cn/
  4. Minlo作用类似于FastDFS和阿里云的OSS进行对象存储
  5. 安装minlo服务器参考:https://blog.csdn.net/u010189683/article/details/108171562
1、添加依赖
<!--minio方案-->
<dependency><groupId>io.minio</groupId><artifactId>minio</artifactId><version>7.0.2</version>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><optional>true</optional>
</dependency>
2、添加配置项
## minio配置 
minio:endpoint: http://192.168.179.131:9000/accessKey: adminsecretKey: admin123456    
3、配置项和工具类
@Data
@Configuration
@ConfigurationProperties(prefix = "minio")
public class MinioConfig {private String endpoint;private String accessKey;private String secretKey;@Beanpublic MinioClient getMinioClient() throws InvalidEndpointException, InvalidPortException {MinioClient minioClient = new MinioClient(endpoint, accessKey, secretKey);return minioClient;}}
@Component
public class MinioUtil {@Value("${minio.endpoint}")private String endpoint;@Value("${minio.accessKey}")private String accessKey;@Value("${minio.secretKey}")private String secretKey;private static final int DEFAULT_EXPIRY_TIME = 7 * 24 * 3600;private static MinioClient minioClient;@Autowired@SneakyThrowspublic MinioClient setMinioClient(){MinioClient minioClient = new MinioClient(endpoint, accessKey, secretKey);return minioClient;}/*** 检查存储桶是否存在*/@SneakyThrowspublic boolean bucketExists(String bucketName){boolean flag = minioClient.bucketExists(bucketName);return flag ? true : false;}/*** 创建存储桶*/@SneakyThrowspublic boolean makeBucket(String bucketName) {boolean flag = bucketExists(bucketName);if(flag) return false;minioClient.makeBucket(bucketName);return true;}/*** 列出所有存储桶名称*/@SneakyThrowspublic List<String> listBucketNames() {List<Bucket> bucketList = listBuckets();return bucketList.stream().map(item->bucket.name()).collect(Collector.toList())}/*** 列出所有存储桶*/@SneakyThrowspublic List<Bucket> listBuckets() {return minioClient.listBuckets();}/*** 删除存储桶*/@SneakyThrowspublic boolean removeBucket(String bucketName) {boolean flag = bucketExists(bucketName);if(flag) return false;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;}}/*** 列出存储桶中的所有对象名称*/@SneakyThrowspublic List<String> listObjectNames(String bucketName) {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;}/*** 列出存储桶中的所有对象*/@SneakyThrowspublic Iterable<Result<Item>> listObjects(String bucketName)  {boolean flag = bucketExists(bucketName);return flag?minioClient.listObjects(bucketName):null;}/*** 通过文件上传到对象*/@SneakyThrowspublic boolean putObject(String bucketName, String objectName, String fileName){boolean flag = bucketExists(bucketName);if (flag) {minioClient.putObject(bucketName, objectName, fileName, null);ObjectStat statObject = statObject(bucketName, objectName);if (statObject != null && statObject.length() > 0) {return true;}}return false;}/*** 通过InputStream上传对象*/@SneakyThrowspublic boolean putObject(String bucketName, String objectName, InputStream stream) {boolean flag = bucketExists(bucketName);if (flag) {minioClient.putObject(bucketName, objectName, stream, new PutObjectOptions(stream.available(), -1));ObjectStat statObject = statObject(bucketName, objectName);if (statObject != null && statObject.length() > 0) {return true;}}return false;}/*** 以流的形式获取一个文件对象*/@SneakyThrowspublic InputStream getObject(String bucketName, String objectName){boolean flag = bucketExists(bucketName);if (flag) {ObjectStat statObject = statObject(bucketName, objectName);if (statObject != null && statObject.length() > 0) {InputStream stream = minioClient.getObject(bucketName, objectName);return stream;}}return null;}/*** 以流的形式获取一个文件对象(断点下载)*/@SneakyThrowspublic InputStream getObject(String bucketName, String objectName, long offset, Long length){boolean flag = bucketExists(bucketName);if (flag) {ObjectStat statObject = statObject(bucketName, objectName);if (statObject != null && statObject.length() > 0) {InputStream stream = minioClient.getObject(bucketName, objectName, offset, length);return stream;}}return null;}/*** 下载并将文件保存到本地*/@SneakyThrowspublic boolean getObject(String bucketName, String objectName, String fileName) {boolean flag = bucketExists(bucketName);if (flag) {ObjectStat statObject = statObject(bucketName, objectName);if (statObject != null && statObject.length() > 0) {minioClient.getObject(bucketName, objectName, fileName);return true;}}return false;}/*** 删除一个对象*/@SneakyThrowspublic boolean removeObject(String bucketName, String objectName) {boolean flag = bucketExists(bucketName);if (flag) {minioClient.removeObject(bucketName, objectName);return true;}return false;}/*** 删除指定桶的多个文件对象,返回删除错误的对象列表,全部删除成功,返回空列表*/@SneakyThrowspublic List<String> removeObject(String bucketName, List<String> objectNames){List<String> deleteErrorNames = new ArrayList<>();boolean flag = bucketExists(bucketName);if (flag) {Iterable<Result<DeleteError>> results = minioClient.removeObjects(bucketName, objectNames);for (Result<DeleteError> result : results) {DeleteError error = result.get();deleteErrorNames.add(error.objectName());}}return deleteErrorNames;}/*** 生成一个给HTTP GET请求用的presigned URL。* 浏览器/移动端的客户端可以用这个URL进行下载,即使其所在的存储桶是私有的。这个presigned URL可以设置一个失效时间,默认值是7天。*/@SneakyThrowspublic String presignedGetObject(String bucketName, String objectName, Integer expires) {boolean flag = bucketExists(bucketName);return bucketExists(bucketName) ? minioClient.presignedGetObject(bucketName, objectName, expires):null;}/*** 生成一个给HTTP PUT请求用的presigned URL。* 浏览器/移动端的客户端可以用这个URL进行上传,即使其所在的存储桶是私有的。这个presigned URL可以设置一个失效时间,默认值是7天。*/@SneakyThrowspublic String presignedPutObject(String bucketName, String objectName, Integer expires) {return bucketExists(bucketName) ? minioClient.presignedPutObject(bucketName, objectName, expires):null;}/*** 获取对象的元数据*/@SneakyThrowspublic ObjectStat statObject(String bucketName, String objectName){return bucketExists(bucketName) ? minioClient.statObject(bucketName, objectName) : null;}/*** 文件访问路径*/@SneakyThrowspublic String getObjectUrl(String bucketName, String objectName) {return bucketExists(bucketName) ? minioClient.getObjectUrl(bucketName, objectName) : "";}
}
http://www.lryc.cn/news/142146.html

相关文章:

  • 多态/虚函数/虚函数表
  • QT中按钮的基类QAbstractButton
  • 并查集(种类并查集,带权并查集)
  • 飞天使-k8s基础组件分析-控制器
  • 有序充电运营管理平台是基于物联网和大数据技术的充电设施管理系统-安科瑞黄安南
  • LeetCode-227-基本计算器Ⅱ
  • dart 学习列表 List
  • 数据结构--树4.2.1(二叉树)
  • Presto之Driver个数
  • R语言响应面(RSM)、线性模型lm分析生产过程影响因素可视化
  • 剑指Offer --- 字符串篇
  • 7.elasticsearch同步工具-logstah
  • Redis之stream类型解读
  • C++ 网络编程项目fastDFS分布式文件系统(九)总结
  • 第五章 树与二叉树 一、树的定义与考点
  • C语言基础之——指针(下)
  • 小研究 - JVM 的类装载机制
  • 项目---日志系统
  • 设计模式--建造者模式(Builder Pattern)
  • 若依vue打印的简单方法
  • Rust 基础语法学习
  • iOS开发Swift-函数
  • 序列化协议:JSON和XML
  • 江西萍乡能源石油化工阀门三维扫描3d测量抄数建模-CASAIM中科广电
  • Go【gin和gorm框架】实现紧急事件登记的接口
  • 第一个VUE程序?
  • 电阻器件的分类
  • QT基础教程之二 第一个Qt小程序
  • Edge用户数据目录查找
  • 最新外卖霸王餐小程序、H5、微信公众号版外卖系统源码|霸王餐美团/饿了么系统/外卖红包cps粉丝裂变玩法源码下载