SpringBoot整合Minio文件存储


Posted in Java/Android onApril 03, 2022

背景

公司的开发框架集成了附件本地存储,阿里云,华为云等,现项目有要求附件存储与应用部署环境不能是同一台服务器,也不能使用云存储,经过技术选型后决定框架整合minio,将minio部署在另一台服务器开通外网端口即可解决问题

Minio安装部署

下载minio安装部署包,创建对应配置文件,这里提供一个整合后的压缩包

下载地址:https://download.csdn.net/download/u013407099/45602196

创建minioData文件夹作为文件存储路径,解压安装包根据放置路径修改对应配置文件文件

minio-service.xml和run.bat

<service>
  <id>minio</id>
  <name>MinIO Service</name>
  <description>MinIO is a High Performance Object Storage</description>
  <logpath>D:\minio\logs</logpath>
  <log mode="roll-by-size">
    <sizeThreshold>10240</sizeThreshold>
    <keepFiles>8</keepFiles>
  </log>
  <executable>D:\minio\run.bat</executable>
</service>
set MINIO_ACCESS_KEY=admin
set MINIO_SECRET_KEY=abcd@1234
minio.exe server -address :9999 D:\minioData

解压部署包后cmd进入对应解压路径,输入命令minio.exe server D:\minioData 初始化后关闭cmd命令

使用服务安装工具安装服务,选择minio-service.exe

windows服务安装工具下载地址:https://download.csdn.net/download/u013407099/45603714

启动服务后访问 http://127.0.0.1:9999/

用户名:admin 密码:abcd@1234 (端口及账户密码都是在run.bat文件中配置的)

进入系统创建bucket用于存储文件(类似于阿里云)

SpringBoot整合Minio文件存储

配置pom文件--h2>

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

配置yml文件

这里分别配置上传/下载地址是正式项目可能配置外网端口后,服务器中不能访问对应的外网端口,上传走内网,下载走外网

#minio配置
  # 上传地址
  minio_uploadurl: http://192.168.1.42:9999/
  # 下载地址
  minio_downloadurl: http://192.168.1.42:9999/
  # 账户
  minio_accesskey: admin
  # 密码
  minio_secrectkey: abcd@1234
  # 存储文件夹
  minio_bucknetname: xxx

Minio工具类

初始化client

public MinioClient InitMinio() {
        MinioClient minioClient = MinioClient.builder().
        endpoint(frameConfig.getMinio_uploadurl()).       		        credentials(frameConfig.getMinio_accesskey(),frameConfig.getMinio_secrectkey()).build();
        try{
            boolean isExist = minioClient.bucketExists(frameConfig.getMinio_bucknetname());
            if (!isExist) {
                minioClient.makeBucket(frameConfig.getMinio_bucknetname());
            }
        }catch (Exception e){
            e.printStackTrace();
        }
        return minioClient;
    }

上传文件

getkey方法只是指定对应的自定义存储路径

指定content-type是为了浏览器能打开附件时,图片和pdf等文件能够在线浏览

不指定默认都是stream,打开文件统一为下载

public boolean uploadMinioFile(InputStream stream, AttachmentDO attachmentDO,String contentType){
        boolean result = true;
        try{
            MinioClient minioClient = InitMinio();
            String bucketName =frameConfig.getMinio_bucknetname();
            PutObjectOptions option = new PutObjectOptions(stream.available(), -1);
            option.setContentType(contentType);
            minioClient.putObject(bucketName,getKey(attachmentDO),stream,option);
        }catch (Exception e){
            logger.error("Minio上传文件失败:" + e.getMessage());
            result = false;
        }
        return result;
    }

下载文件

需要注意的是,生成的文件下载地址是和MinioClient中指定的服务器地址绑定的,使用nginx代理后是无效的

public  String readMinioCommonFile(AttachmentDO attachmentDO){
        String fileurl = "";
        try{
            MinioClient minioClient = InitMinio();
            String bucketName =frameConfig.getMinio_bucknetname();
            return minioClient.presignedGetObject(bucketName, getKey(attachmentDO));
        }catch (Exception e){
            logger.error("Minio读取文件失败:" + e.getMessage());
        }
        return fileurl;
    }

删除文件

public  boolean deleteMinioFile(AttachmentDO attachmentDO){
        boolean result = true;
        try{
            MinioClient minioClient = InitMinio();
            String bucketName =frameConfig.getMinio_bucknetname();
            minioClient.removeObject(bucketName,getKey(attachmentDO));
        }catch (Exception e){
            logger.error("Minio删除文件失败:" + e.getMessage());
            result = false;
        }
        return result;
    }

 

Java/Android 相关文章推荐
Java输出Hello World完美过程解析
Jun 13 Java/Android
Java并发编程之Executor接口的使用
Jun 21 Java/Android
Java常用函数式接口总结
Jun 29 Java/Android
解决Swagger2返回map复杂结构不能解析的问题
Jul 02 Java/Android
JAVA API 实用类 String详解
Oct 05 Java/Android
springboot如何接收application/x-www-form-urlencoded类型的请求
Nov 02 Java/Android
使用jpa之动态插入与修改(重写save)
Nov 23 Java/Android
Java 常见的限流算法详细分析并实现
Apr 07 Java/Android
Java8利用Stream对列表进行去除重复的方法详解
Apr 14 Java/Android
Elasticsearch Recovery 详细介绍
Apr 19 Java/Android
Mybatis-Plus 使用 @TableField 自动填充日期
Apr 26 Java/Android
Springboot集成kafka高级应用实战分享
Aug 14 Java/Android
Java中Quartz高可用定时任务快速入门
Apr 03 #Java/Android
Spring Security使用单点登录的权限功能
Spring Boot 底层原理基础深度解析
Java 超详细讲解数据结构中的堆的应用
Java 数据结构七大排序使用分析
Java基础——Map集合
Apr 01 #Java/Android
Android基于Fresco实现圆角和圆形图片
Apr 01 #Java/Android
You might like
php自定义session示例分享
2014/04/22 PHP
win7安装php框架Yii的方法
2016/01/25 PHP
做网页的一些技巧
2007/02/01 Javascript
Ext面向对象开发实践(续)
2008/11/18 Javascript
JS验证日期的格式YYYY-mm-dd 具体实现
2013/06/29 Javascript
jQuery setTimeout传递字符串参数报错的解决方法
2014/06/09 Javascript
JavaScript检测鼠标移动方向的方法
2015/05/22 Javascript
cocos2dx骨骼动画Armature源码剖析(一)
2015/09/08 Javascript
Javascript打印局部页面实例
2016/06/21 Javascript
mpvue项目中使用第三方UI组件库的方法
2018/09/30 Javascript
详解如何解决vue开发请求数据跨域的问题(基于浏览器的配置解决)
2018/11/12 Javascript
vue基于v-charts封装双向条形图的实现代码
2019/12/09 Javascript
JS监听组合按键思路及实现过程
2020/04/17 Javascript
javascript 模块依赖管理的本质深入详解
2020/04/30 Javascript
vue父子组件间引用之$parent、$children
2020/05/20 Javascript
[59:07]海涛为你详解DOTA2新版本“贤哲秘契”
2014/11/22 DOTA
Python判断对象是否相等及eq函数的讲解
2019/02/25 Python
Python中的异常处理try/except/finally/raise用法分析
2019/02/28 Python
Python实现的栈、队列、文件目录遍历操作示例
2019/05/06 Python
pyqt5实现按钮添加背景图片以及背景图片的切换方法
2019/06/13 Python
python打包成so文件过程解析
2019/09/28 Python
python元组和字典的内建函数实例详解
2019/10/22 Python
Python基于模块Paramiko实现SSHv2协议
2020/04/28 Python
美国玛丽莎收藏奢华时尚商店:Marissa Collections
2016/11/21 全球购物
servlet面试题
2012/08/20 面试题
车间组长岗位职责
2013/12/20 职场文书
家具厂厂长岗位职责
2014/01/01 职场文书
年会搞笑主持词串词
2014/03/24 职场文书
元旦联欢会主持词
2014/03/26 职场文书
党员学习中共十八大思想报告
2014/09/12 职场文书
场地使用证明模板
2014/10/25 职场文书
爱心募捐通知范文
2015/04/27 职场文书
面试中老生常谈的MySQL问答集锦夯实基础
2022/03/13 MySQL
2021年国漫热度排行前十,完美世界上榜,第四是美国动画作品
2022/03/18 国漫
《进击的巨人》新联动CM 兵长强势出击兽巨人
2022/04/05 日漫
Python实现聚类K-means算法详解
2022/07/15 Python