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中重写父类方法加不加@Override详解
Jun 21 Java/Android
基于Java的MathML转图片的方法(示例代码)
Jun 23 Java/Android
简单总结SpringMVC拦截器的使用方法
Jun 28 Java/Android
ObjectMapper 如何忽略字段大小写
Jun 29 Java/Android
解决MultipartFile.transferTo(dest) 报FileNotFoundExcep的问题
Jul 01 Java/Android
java设计模式--七大原则详解
Jul 21 Java/Android
Mybatis是这样防止sql注入的
Dec 06 Java/Android
java版 联机五子棋游戏
May 04 Java/Android
Java线程的6种状态与生命周期
May 11 Java/Android
Android Studio实现带三角函数对数运算功能的高级计算器
May 20 Java/Android
Android Canvas绘制文字横纵向对齐
Jun 05 Java/Android
SpringBoot深入分析讲解监听器模式下
Jul 15 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
ci检测是ajax还是页面post提交数据的方法
2014/11/10 PHP
PHP使用xmllint命令处理xml与html的方法
2014/12/15 PHP
浅析Yii2中GridView常见操作
2016/04/22 PHP
PHP获取IP地址所在地信息的实例(使用纯真IP数据库qqwry.dat)
2016/11/15 PHP
PHP实现动态添加XML中数据的方法
2018/03/30 PHP
JavaScript与函数式编程解释
2007/04/27 Javascript
IE6、IE7中setAttribute不支持class/for/rowspan/colspan等属性
2011/08/28 Javascript
JavaScript日期时间格式化函数分享
2014/05/05 Javascript
jquery 表格排序、实时搜索表格内容(附图)
2014/05/19 Javascript
JS实现网页滚动条感应鼠标变色的方法
2015/02/26 Javascript
jquery动感漂浮导航菜单代码分享
2020/04/15 Javascript
浅析JavaScript中的变量复制、参数传递和作用域链
2016/01/13 Javascript
基于JavaScript实现 网页切出 网站title变化代码
2016/04/03 Javascript
js原型链与继承解析(初体验)
2016/05/09 Javascript
js eval函数使用,js对象和字符串互转实例
2017/03/06 Javascript
Vue.js tab实现选项卡切换
2017/05/16 Javascript
layer 刷新某个页面的实现方法
2019/09/05 Javascript
vue中keep-alive、activated的探讨和使用详解
2020/07/26 Javascript
微信小程序实现多行文字滚动
2020/11/18 Javascript
[42:39]老党炸弹人试玩视频
2014/09/03 DOTA
Python 连连看连接算法
2008/11/22 Python
Python设计模式之单例模式实例
2014/04/26 Python
浅谈python socket函数中,send与sendall的区别与使用方法
2017/05/09 Python
Python简单实现socket信息发送与监听功能示例
2018/01/03 Python
英国儿童设计师服装的领先零售商:Base
2019/03/17 全球购物
加拿大在线眼镜零售商:SmartBuyGlasses加拿大
2019/05/25 全球购物
北京鼎普科技股份有限公司软件测试面试题
2012/04/07 面试题
思想品德自我鉴定
2013/10/12 职场文书
专业实习自我鉴定
2013/10/29 职场文书
关爱留守儿童标语
2014/06/18 职场文书
十八大标语口号
2014/10/09 职场文书
2014年内部审计工作总结
2014/12/09 职场文书
教师个人事迹材料
2014/12/17 职场文书
小学作文指导之如何写人?
2019/07/08 职场文书
升级 Win11 还是坚守 Win10?微软 Win11 新系统缺失功能大盘点
2022/04/05 数码科技
Python中的 No Module named ***问题及解决
2022/07/23 Python