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 相关文章推荐
手把手教你用SpringBoot将文件打包成zip存放或导出
Jun 11 Java/Android
Java实战之用Swing实现通讯录管理系统
Jun 13 Java/Android
Spring Data JPA使用JPQL与原生SQL进行查询的操作
Jun 15 Java/Android
Java基于字符界面的简易收银台
Jun 26 Java/Android
Springboot使用Spring Data JPA实现数据库操作
Jun 30 Java/Android
JavaGUI模仿QQ聊天功能完整版
Jul 04 Java/Android
Java org.w3c.dom.Document 类方法引用报错
Aug 07 Java/Android
JPA 通过Specification如何实现复杂查询
Nov 23 Java/Android
InterProcessMutex实现zookeeper分布式锁原理
Mar 21 Java/Android
Java虚拟机内存结构及编码实战分享
Apr 07 Java/Android
Java工作中实用的代码优化技巧分享
Apr 21 Java/Android
Android实现图片九宫格
Jun 28 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
mysql时区问题
2008/03/26 PHP
php 正则表达式小结
2009/08/31 PHP
两个php日期控制类实例
2014/12/09 PHP
Thinkphp模板标签if和eq的区别和比较实例分析
2015/07/01 PHP
php进行ip地址掩码运算处理的方法
2016/07/11 PHP
Yii2简单实现多语言配置的方法
2016/07/23 PHP
详解Yii2 之 生成 URL 的方法
2017/06/16 PHP
Javascript 两个窗体之间传值实现代码
2009/09/25 Javascript
JavaScript 字符串与数组转换函数[不用split与join]
2009/12/13 Javascript
用js来定义浏览器中一个左右浮动元素相对于页面主体宽度的位置的函数
2012/01/21 Javascript
js函数排序的实例代码
2013/07/01 Javascript
浅谈JavaScript中的Math.atan()方法的使用
2015/06/14 Javascript
关于vue.js过渡css类名的理解(推荐)
2017/04/10 Javascript
微信小程序封装http访问网络库实例代码
2017/05/24 Javascript
自定义vue全局组件use使用、vuex的使用详解
2017/06/14 Javascript
AngularJS service之select下拉菜单效果
2017/07/28 Javascript
微信小程序 input输入及动态设置按钮的实现
2017/10/27 Javascript
vue中element-ui表格缩略图悬浮放大功能的实例代码
2018/06/26 Javascript
微信小程序利用canvas 绘制幸运大转盘功能
2018/07/06 Javascript
代码实例ajax实现点击加载更多数据图片
2018/10/12 Javascript
原生js canvas实现鼠标跟随效果
2020/08/02 Javascript
Python程序中用csv模块来操作csv文件的基本使用教程
2016/03/03 Python
python爬取亚马逊书籍信息代码分享
2017/12/09 Python
浅析python中的迭代与迭代对象
2018/10/08 Python
flask框架蓝图和子域名配置详解
2020/01/25 Python
python实现udp传输图片功能
2020/03/20 Python
稀有和绝版书籍:Biblio.com
2017/02/02 全球购物
德国骆驼商店:ActiveFashionWorld
2017/11/18 全球购物
什么是反射?如何实现反射?
2016/07/25 面试题
小学生获奖感言范文
2014/02/02 职场文书
水利公司纪检监察自我鉴定
2014/02/25 职场文书
优质护理服务演讲稿
2014/05/07 职场文书
高中生第一学年自我鉴定2015
2014/09/28 职场文书
2014年大班保育员工作总结
2014/12/02 职场文书
pandas提升计算效率的一些方法汇总
2021/05/30 Python
Nginx 502 bad gateway错误解决的九种方案及原因
2022/08/14 Servers