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框架入门之简单介绍SpringBoot框架
Jun 18 Java/Android
Java集成swagger文档组件
Jun 28 Java/Android
ObjectMapper 如何忽略字段大小写
Jun 29 Java/Android
Java实现二分搜索树的示例代码
Mar 17 Java/Android
springboot+zookeeper实现分布式锁
Mar 21 Java/Android
详解Alibaba Java诊断工具Arthas查看Dubbo动态代理类
Apr 08 Java/Android
SpringCloud项目如何解决log4j2漏洞
Apr 10 Java/Android
java中为什么说子类的构造方法默认访问的是父类的无参构造方法
Apr 13 Java/Android
MyBatis核心源码深度剖析SQL语句执行过程
May 20 Java/Android
java中如何截取字符串最后一位
Jul 07 Java/Android
Spring boot实现上传文件到本地服务器
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 str_replace的替换漏洞
2008/03/15 PHP
php打印一个边长为N的实心和空心菱型的方法
2015/03/02 PHP
PHP四种基本排序算法示例
2015/04/09 PHP
PHP实现上一篇下一篇的方法实例总结
2016/09/22 PHP
CI框架实现框架前后端分离的方法详解
2016/12/30 PHP
laravel-admin 实现在指定的相册下添加照片
2019/10/21 PHP
JavaScript 学习初步 入门教程
2010/03/25 Javascript
jQuery.validate 常用方法及需要注意的问题
2013/03/20 Javascript
详解JS 比较两个Json对象的值是否相等的实例
2013/11/20 Javascript
javascript阻止浏览器后退事件防止误操作清空表单
2013/11/22 Javascript
原生js获取宽高与jquery获取宽高的方法关系对比
2014/04/04 Javascript
JavaScript模拟鼠标右键菜单效果
2020/12/08 Javascript
jQuery使用$获取对象后检查该对象是否存在的实现方法
2016/09/04 Javascript
NPM 安装cordova时警告:npm WARN deprecated minimatch@2.0.10: Please update to minimatch 3.0.2 or higher to
2016/12/20 Javascript
JavaScript数组去重的多种方法(四种)
2017/09/19 Javascript
Vue使用枚举类型实现HTML下拉框步骤详解
2018/02/05 Javascript
Node.js实现一个HTTP服务器的方法示例
2019/05/13 Javascript
vue中watch的用法汇总
2020/12/28 Vue.js
数据清洗--DataFrame中的空值处理方法
2018/07/03 Python
Python 字符串与数字输出方法
2018/07/16 Python
python实现感知器算法(批处理)
2019/01/18 Python
pyqt 实现为长内容添加滑轮 scrollArea
2019/06/19 Python
为什么说Python可以实现所有的算法
2019/10/04 Python
详解pycharm配置python解释器的问题
2020/10/15 Python
python中pyqtgraph知识点总结
2021/01/26 Python
AmazeUI 折叠面板的实现代码
2020/08/17 HTML / CSS
中科软测试工程师面试题
2012/06/16 面试题
经典优秀个人求职信分享
2013/12/12 职场文书
大学生通用个人的自我评价
2014/02/10 职场文书
个人授权委托书
2014/04/03 职场文书
六一儿童节演讲稿
2014/05/23 职场文书
优秀乡村医生先进事迹材料
2014/08/23 职场文书
党的群众路线教育实践活动党员个人整改措施
2014/10/27 职场文书
幼儿园端午节活动总结
2015/05/05 职场文书
JavaScript中时间格式化新思路toLocaleString()
2021/11/07 Javascript
spring cloud eureka 服务启动失败的原因分析及解决方法
2022/03/17 Java/Android