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 相关文章推荐
IDEA使用SpringAssistant插件创建SpringCloud项目
Jun 23 Java/Android
Java Dubbo框架知识点梳理
Jun 26 Java/Android
Java基础之线程锁相关知识总结
Jun 30 Java/Android
Java spring单点登录系统
Sep 04 Java/Android
关于springboot配置druid数据源不生效问题(踩坑记)
Sep 25 Java/Android
SpringDataJPA实体类关系映射配置方式
Dec 06 Java/Android
Java设计模式之享元模式示例详解
Mar 03 Java/Android
Java实现扫雷游戏详细代码讲解
May 25 Java/Android
Android开发手册TextInputLayout样式使用示例
Jun 10 Java/Android
使用Postman测试需要授权的接口问题
Jun 21 Java/Android
Java 中的 Lambda List 转 Map 的多种方法详解
Jul 07 Java/Android
阿里面试Nacos配置中心交互模型是push还是pull原理解析
Jul 23 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
终于听上了直流胆调频
2021/03/02 无线电
一个捕获函数输出的函数
2007/02/14 PHP
PHP Zip解压 文件在线解压缩的函数代码
2010/05/26 PHP
Codeigniter实现发送带附件的邮件
2015/03/19 PHP
CodeIgniter配置之autoload.php自动加载用法分析
2016/01/20 PHP
PHP面向对象程序设计之对象生成方法详解
2016/12/02 PHP
php表单习惯用的正则表达式
2017/10/11 PHP
Yii框架数据库查询、增加、删除操作示例
2019/10/14 PHP
!DOCTYPE声明对JavaScript的影响分析
2010/04/12 Javascript
jquery 操作DOM案例代码分享
2012/04/05 Javascript
Map.vue基于百度地图组件重构笔记分享
2017/04/17 Javascript
jquery ajax异步提交表单数据的方法
2017/10/27 jQuery
vue-router实现嵌套路由的讲解
2019/01/19 Javascript
jQuery插件实现非常实用的tab栏切换功能【案例】
2019/02/18 jQuery
JavaScript实现公告栏上下滚动效果
2020/03/13 Javascript
解决vue bus.$emit触发第一次$on监听不到问题
2020/07/28 Javascript
通过实例解析jQ Ajax操作相关原理
2020/09/23 Javascript
[02:37]2018DOTA2亚洲邀请赛赛前采访-EG篇
2018/04/03 DOTA
在Python中使用next()方法操作文件的教程
2015/05/24 Python
python使用Flask操作mysql实现登录功能
2018/05/14 Python
python实现计数排序与桶排序实例代码
2019/03/28 Python
python 命令行传入参数实现解析
2019/08/30 Python
Python sklearn中的.fit与.predict的用法说明
2020/06/28 Python
Python字符串三种格式化输出
2020/09/17 Python
一款利用css3的鼠标经过动画显示详情特效的实例教程
2014/12/29 HTML / CSS
英国广泛的照明产品网站:Lights4living
2018/01/28 全球购物
Lululemon加拿大官网:加拿大知名体育服装零售商
2019/04/12 全球购物
Java语言程序设计测试题改错题部分
2014/07/22 面试题
网络维护管理员的自我评价分享
2013/11/11 职场文书
法学专业大学生实习自我鉴定
2014/10/05 职场文书
小学语文继续教育研修日志
2015/11/13 职场文书
2016年国庆节宣传标语
2015/11/25 职场文书
2016秋季田径运动会广播稿
2015/12/21 职场文书
驾驶员安全责任协议书
2016/03/22 职场文书
MySQL中的布尔值,怎么存储false或true
2021/06/04 MySQL
电脑开机弹出documents文件夹怎么回事?弹出documents文件夹解决方法
2022/04/08 数码科技