SpringBoot整合Minio文件存储

2022-03-16 09:18:03

背景

公司的开发框架集成了附件本地存储,阿里云,华为云等,现项目有要求附件存储与应用部署环境不能是同一台服务器,也不能使用云存储,经过技术选型后决定框架整合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><logmode="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用于存储文件(类似于阿里云)

配置pom文件

<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

publicMinioClientInitMinio(){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,打开文件统一为下载

publicbooleanuploadMinioFile(InputStream stream,AttachmentDO attachmentDO,String contentType){boolean result=true;try{MinioClient minioClient=InitMinio();String bucketName=frameConfig.getMinio_bucknetname();PutObjectOptions option=newPutObjectOptions(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代理后是无效的

publicStringreadMinioCommonFile(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;}

删除文件

publicbooleandeleteMinioFile(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;}
  • 作者:code2roc
  • 原文链接:https://blog.csdn.net/u013407099/article/details/121440412
    更新时间:2022-03-16 09:18:03