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 相关文章推荐
Win10系统下配置Java环境变量
Jun 13 Java/Android
浅谈resultMap的用法及关联结果集映射
Jun 30 Java/Android
小程序与后端Java接口交互实现HelloWorld入门
Jul 09 Java/Android
在Spring-Boot中如何使用@Value注解注入集合类
Aug 02 Java/Android
mybatis3中@SelectProvider传递参数方式
Aug 04 Java/Android
Spring Security中用JWT退出登录时遇到的坑
Oct 16 Java/Android
Android自定义scrollview实现回弹效果
Apr 01 Java/Android
Java 垃圾回收超详细讲解记忆集和卡表
Apr 08 Java/Android
Java存储没有重复元素的数组
Apr 29 Java/Android
springboot实现string转json json里面带数组
Jun 16 Java/Android
springboot创建的web项目整合Quartz框架的项目实践
Jun 21 Java/Android
Android实现获取短信验证码并自动填充
May 21 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
PHP5 的对象赋值机制介绍
2011/08/02 PHP
PHP学习笔记(三):数据类型转换与常量介绍
2015/04/17 PHP
飞鱼(shqlsl) javascript作品集
2006/12/16 Javascript
javascript之更有效率的字符串替换
2008/08/02 Javascript
分享27款非常棒的jQuery 表单插件
2011/03/28 Javascript
JS文本框不能输入空格验证方法
2013/03/19 Javascript
js获取IFRAME当前的URL的方法
2013/11/13 Javascript
在css加载完毕后自动判断页面是否加入css或js文件
2014/09/10 Javascript
网页中JS函数自动执行常用三种方法
2016/03/30 Javascript
JS模拟的Map类实现方法
2016/06/17 Javascript
浅谈jQuery中的eq()与DOM中element.[]的区别
2016/10/28 Javascript
jQuery实现对象转为url参数的方法
2017/01/11 Javascript
three.js实现围绕某物体旋转
2017/01/25 Javascript
vue数据双向绑定原理解析(get &amp; set)
2017/03/08 Javascript
Node.js使用Express创建Web项目详细教程
2017/03/31 Javascript
bootstrap栅格系统示例代码分享
2017/05/22 Javascript
JS设计模式之命令模式概念与用法分析
2018/02/06 Javascript
解决Vue.js由于延时显示了{{message}}引用界面的问题
2018/08/25 Javascript
vue-cli3 从搭建到优化的详细步骤
2019/01/20 Javascript
jquery-ui 进度条功能示例【测试可用】
2019/07/25 jQuery
vuex实现购物车功能
2020/06/28 Javascript
Python 文件和输入输出小结
2013/10/09 Python
C#返回当前系统所有可用驱动器符号的方法
2015/04/18 Python
编写Python爬虫抓取豆瓣电影TOP100及用户头像的方法
2016/01/20 Python
Python使用Windows API创建窗口示例【基于win32gui模块】
2018/05/09 Python
详解Python3中setuptools、Pip安装教程
2019/06/18 Python
Django框架组成结构、基本概念与文件功能分析
2019/07/30 Python
Python的Lambda函数用法详解
2019/09/03 Python
keras实现theano和tensorflow训练的模型相互转换
2020/06/19 Python
css3实现图片遮罩效果鼠标hover以后出现文字
2013/11/05 HTML / CSS
Styleonme中文网:韩国高档人气品牌
2017/06/21 全球购物
写给女朋友的道歉信
2014/01/12 职场文书
师范生求职自荐信
2014/06/14 职场文书
技术负责人岗位职责
2015/02/10 职场文书
护士求职自荐信
2015/03/25 职场文书
Django 如何实现文件上传下载
2021/04/08 Python