网易首页 > 网易号 > 正文 申请入驻

SpringBoot + minio实现高性能存储服务,So Easy ~ Github Star 51.7K+

0
分享至

Java精选面试题(微信小程序):5000+道面试题和选择题,真实面经简历模版,包含Java基础、并发、JVM、线程、MQ系列、Redis、Spring系列、Elasticsearch、Docker、K8s、Flink、Spark、架构设计、大厂真题等,在线随时刷题!

什么是minio

MinIO是一个基于Go实现的高性能、兼容S3协议的对象存储。它采用GNU AGPL v3开源协议,项目地址是https://github.com/minio/minio。

引用官网:

MinIO是根据GNU Affero通用公共许可证v3.0发布的高性能对象存储。它与Amazon S3云存储服务兼容。使用MinIO构建用于机器学习,分析和应用程序数据工作负载的高性能基础架构。

官网地址:

https://min.io/

文档地址:

https://docs.min.io/
一. 使用docker 搭建minio 服务GNU / Linux和macOS

docker run -p 9000:9000 \   --name minio1 \   -v /mnt/data:/data \   -e "MINIO_ROOT_USER=AKIAIOSFODNN7EXAMPLE" \   -e "MINIO_ROOT_PASSWORD=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY" \   minio/minio server /data

windows

docker run -p 9000:9000 \   --name minio1 \   -v D:\data:/data \   -e "MINIO_ROOT_USER=AKIAIOSFODNN7EXAMPLE" \   -e "MINIO_ROOT_PASSWORD=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY" \   minio/minio server /data
  • MINIO_ROOT_USER:为用户key

  • MINIO_ROOT_PASSWORD:为用户密钥

以上搭建的都是单机版的。想要了解分布式 的方式请查看官网文档。

这就是在win的docker上运行的。

更多开源项目:https://www.yoodb.com/projects/springboot-user-manger.html

当启动后在浏览器访问http://localhost:9000就可以访问minio的图形化界面了,如图所示:

二. 下面开始搭建springboot 环境

初始化一个springboot项目大家都会,这里不多做介绍。

主要是介绍需要引入的依赖:

              org.springframework.boot             spring-boot-starter-thymeleaf                               io.minio             minio             8.2.1                               org.projectlombok             lombok             true        

依赖可以官方文档里找:https://docs.min.io/docs/java-client-quickstart-guide.html

下面介绍配置文件:

spring:   servlet:     multipart:       max-file-size: 10MB       max-request-size: 10MB #minio配置   minio:     access-key: AKIAIOSFODNN7EXAMPLE      #key就是docker初始化是设置的,密钥相同     secret-key: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY     url: http://localhost:9000     bucket-name: wdhcr   thymeleaf:     cache: false

创建minio的配置类:

@Configuration @ConfigurationProperties(prefix = "spring.minio") @Data public class MinioConfiguration {     private String accessKey;     private String secretKey;     private String url;     private String bucketName;     @Bean     public MinioClient minioClient() {         return MinioClient.builder()                 .endpoint(url)                 .credentials(accessKey, secretKey)                 .build();     } }

使用配置属性绑定进行参数绑定,并初始化一个minio client对象放入容器中。

下面就是我封装的minio client 操作minio的简单方法的组件。

@Component public class MinioComp {     @Autowired     private MinioClient minioClient;     @Autowired     private MinioConfiguration configuration;     /**      * @description: 获取上传临时签名,公众 号Java精选      * @dateTime: 2021/5/13 14:12      */     public Map getPolicy(String fileName, ZonedDateTime time) {         PostPolicy postPolicy = new PostPolicy(configuration.getBucketName(), time);         postPolicy.addEqualsCondition("key", fileName);         try {             Map map = minioClient.getPresignedPostFormData(postPolicy);             HashMap map1 = new HashMap<>();             map.forEach((k,v)->{                map1.put(k.replaceAll("-",""),v);            });             map1.put("host",configuration.getUrl()+"/"+configuration.getBucketName());             return map1;         } catch (ErrorResponseException e) {             e.printStackTrace();         } catch (InsufficientDataException e) {             e.printStackTrace();         } catch (InternalException e) {             e.printStackTrace();         } catch (InvalidKeyException e) {             e.printStackTrace();         } catch (InvalidResponseException e) {             e.printStackTrace();         } catch (IOException e) {             e.printStackTrace();         } catch (NoSuchAlgorithmException e) {             e.printStackTrace();         } catch (ServerException e) {             e.printStackTrace();         } catch (XmlParserException e) {             e.printStackTrace();         }         return null;     }     /**      * @description: 获取上传文件的url,公众 号Java精选,有惊喜!      * @dateTime: 2021/5/13 14:15      */     public String getPolicyUrl(String objectName, Method method, int time, TimeUnit timeUnit) {         try {             return minioClient.getPresignedObjectUrl(GetPresignedObjectUrlArgs.builder()                     .method(method)                     .bucket(configuration.getBucketName())                     .object(objectName)                     .expiry(time, timeUnit).build());         } catch (ErrorResponseException e) {             e.printStackTrace();         } catch (InsufficientDataException e) {             e.printStackTrace();         } catch (InternalException e) {             e.printStackTrace();         } catch (InvalidKeyException e) {             e.printStackTrace();         } catch (InvalidResponseException e) {             e.printStackTrace();         } catch (IOException e) {             e.printStackTrace();         } catch (NoSuchAlgorithmException e) {             e.printStackTrace();         } catch (XmlParserException e) {             e.printStackTrace();         } catch (ServerException e) {             e.printStackTrace();         }         return null;     }     /**      * @description: 上传文件      * @dateTime: 2021/5/13 14:17      */     public void upload(MultipartFile file, String fileName) {         // 使用putObject上传一个文件到存储桶中。         try {             InputStream inputStream = file.getInputStream();             minioClient.putObject(PutObjectArgs.builder()                     .bucket(configuration.getBucketName())                     .object(fileName)                     .stream(inputStream, file.getSize(), -1)                     .contentType(file.getContentType())                     .build());         } catch (ErrorResponseException e) {             e.printStackTrace();         } catch (InsufficientDataException e) {             e.printStackTrace();         } catch (InternalException e) {             e.printStackTrace();         } catch (InvalidKeyException e) {             e.printStackTrace();         } catch (InvalidResponseException e) {             e.printStackTrace();         } catch (IOException e) {             e.printStackTrace();         } catch (NoSuchAlgorithmException e) {             e.printStackTrace();         } catch (ServerException e) {             e.printStackTrace();         } catch (XmlParserException e) {             e.printStackTrace();         }     }   /**      * @description: 根据filename获取文件访问地址      * @dateTime: 2021/5/17 11:28      */     public String getUrl(String objectName, int time, TimeUnit timeUnit) {         String url = null;         try {             url = minioClient.getPresignedObjectUrl(GetPresignedObjectUrlArgs.builder()                     .method(Method.GET)                     .bucket(configuration.getBucketName())                     .object(objectName)                     .expiry(time, timeUnit).build());         } catch (ErrorResponseException e) {             e.printStackTrace();         } catch (InsufficientDataException e) {             e.printStackTrace();         } catch (InternalException e) {             e.printStackTrace();         } catch (InvalidKeyException e) {             e.printStackTrace();         } catch (InvalidResponseException e) {             e.printStackTrace();         } catch (IOException e) {             e.printStackTrace();         } catch (NoSuchAlgorithmException e) {             e.printStackTrace();         } catch (XmlParserException e) {             e.printStackTrace();         } catch (ServerException e) {             e.printStackTrace();         }         return url;     } }

简单说明:

  • 使用MultipartFile接收前端文件流,再上传到minio。

  • 构建一个formData的签名数据,给前端,让前端之前上传到minio。

  • 构建一个可以上传的临时URL给前端,前端通过携带文件请求该URL进行上传。

  • 使用filename请求服务端获取临时访问文件的URL。(最长时间为7 天,想要永久性访问,需要其他设置,这里不做说明。)

  • 推荐,公众 号Java精选,回复java面试,获取面试资料,支持在线刷题。

下面展示页面html,使用的是VUE+element-ui进行渲染。

    "UTF-8">         "stylesheet" href="https://unpkg.com/element-ui/lib/theme-chalk/index.css">     上传图片 "app" >     "2" >         "8" >             "div-center-class" >                 "" >                     传统上传                                                upload-demo"                             action= "#"                             drag                             :http-request= "uploadHandle" >                         "el-icon-upload">                         "el-upload__text" >将文件拖到此处,或点击上传                         "el-upload__tip"  slot= "tip" >只能上传jpg/png文件,且不超过500kb                                         "imgUrl" >                         "imgUrl" style="width: 40px;height: 40px">                                                                 "8" >             "div-center-class" >                 "" >                     前端formData直传                                                upload-demo"                             action= "#"                             drag                             :http-request= "httpRequestHandle" >                         "el-icon-upload">                         "el-upload__text" >将文件拖到此处,或点击上传                         "el-upload__tip"  slot= "tip" >只能上传jpg/png文件,且不超过500kb                                         "directUrl" >                         "directUrl" style="width: 40px;height: 40px">                                                                 "8" >             "div-center-class" >                 "" >                     前端Url直传                                                upload-demo"                             action= "#"                             drag                             :http-request= "UrlUploadHandle" >                         "el-icon-upload">                         "el-upload__text" >将文件拖到此处,或点击上传                         "el-upload__tip"  slot= "tip" >只能上传jpg/png文件,且不超过500kb                                         "uploadUrl" >                         "uploadUrl" style="width: 40px;height: 40px">                                                            

页面的效果就如上图所示。

可以分别体验不同的实现效果。

以上就是使用springboot搭建基于minio的高性能存储服务的全部步骤了。

本项目地址:

https://gitee.com/jack_whh/minio-upload

作者:HUWD https://blog.csdn.net/weixin_45089791/article/details/116921075/

公众号“Java精选”所发表内容注明来源的,版权归原出处所有(无法查证版权的或者未注明出处的均来自网络,系转载,转载的目的在于传递更多信息,版权属于原作者。如有侵权,请联系,笔者会第一时间删除处理!

最近有很多人问,有没有读者交流群!加入方式很简单,公众号Java精选,回复“加群”,即可入群!

文章有帮助的话,点在看,转发吧!

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
16岁丧母,28岁被判死刑,这个从未幸福的疯子,教会全人类如何去爱

16岁丧母,28岁被判死刑,这个从未幸福的疯子,教会全人类如何去爱

英国那些事儿
2026-02-02 08:08:08
1976年,肖劲光偶遇水静,闲聊时跟陈士榘说:15年前她打败过陶勇

1976年,肖劲光偶遇水静,闲聊时跟陈士榘说:15年前她打败过陶勇

简史档案馆
2026-02-03 11:05:03
达成!哈登离队!1换2联手米切尔,东部黑马?

达成!哈登离队!1换2联手米切尔,东部黑马?

Haviven聊球
2026-02-04 12:15:20
具俊晔公开大S死因!去机场路上心脏骤停,医生称大S猝死与怀孕有关

具俊晔公开大S死因!去机场路上心脏骤停,医生称大S猝死与怀孕有关

不八卦掌门人
2026-02-04 10:40:09
'余生好好走',知名央视主持人王小丫,在病床上的留言字字催泪

'余生好好走',知名央视主持人王小丫,在病床上的留言字字催泪

枫尘余往逝
2026-02-03 11:27:29
疯狂一夜,三大交易完成,勇士追字母哥欲签老詹,公牛还有大交易

疯狂一夜,三大交易完成,勇士追字母哥欲签老詹,公牛还有大交易

毒舌NBA
2026-02-04 06:10:22
詹皇梦碎了?哈登交易达成!白扔230万也要离开,骑士首发太豪华

詹皇梦碎了?哈登交易达成!白扔230万也要离开,骑士首发太豪华

你的篮球频道
2026-02-04 09:46:47
Here we go!罗马诺:坎特加盟费内巴切,签约两年半

Here we go!罗马诺:坎特加盟费内巴切,签约两年半

懂球帝
2026-02-04 06:22:11
周生生就“足金挂坠检出铁银钯”事件发布检测报告:该批次货品质量完全符合国家相关标准

周生生就“足金挂坠检出铁银钯”事件发布检测报告:该批次货品质量完全符合国家相关标准

闪电新闻
2026-02-04 09:23:59
男子阴茎癌晚期,夫妻生活一向干净,妻子:他就是改不了这个习惯

男子阴茎癌晚期,夫妻生活一向干净,妻子:他就是改不了这个习惯

路医生健康科普
2026-02-04 06:00:03
3队4人!连续四笔交易!改变整个NBA格局

3队4人!连续四笔交易!改变整个NBA格局

篮球教学论坛
2026-02-04 11:39:17
沙特高管勒令C罗结束罢赛!日薪50万镑却3年0冠 遭怒批:榨干球队

沙特高管勒令C罗结束罢赛!日薪50万镑却3年0冠 遭怒批:榨干球队

我爱英超
2026-02-04 07:27:15
1966年言慧珠家中自尽,留下的11岁儿子言清卿惨遭继父与保姆虐待

1966年言慧珠家中自尽,留下的11岁儿子言清卿惨遭继父与保姆虐待

鉴史录
2026-02-02 22:00:19
球报:利雅得胜利禁止主教练和任何球员就C罗的抗议发表看法

球报:利雅得胜利禁止主教练和任何球员就C罗的抗议发表看法

懂球帝
2026-02-04 11:41:25
28岁女子挑战“从上海坐公交车回贵阳过年”,途中找不到合适车辆无奈转乘火车,家属:已备好酸汤鱼等美食迎接妹妹

28岁女子挑战“从上海坐公交车回贵阳过年”,途中找不到合适车辆无奈转乘火车,家属:已备好酸汤鱼等美食迎接妹妹

极目新闻
2026-02-04 11:33:19
中国越买越少,普京没法再装看不见!2025年中俄贸易大幅度下降

中国越买越少,普京没法再装看不见!2025年中俄贸易大幅度下降

户外钓鱼哥阿旱
2026-02-03 18:20:38
建国后,博古妻子哭求杨尚昆帮衬生活困难,杨尚昆是如何回复的?

建国后,博古妻子哭求杨尚昆帮衬生活困难,杨尚昆是如何回复的?

唠叨说历史
2025-12-30 10:35:28
百度搜索Kimi官网前4条都是广告,Kimi不忍了,公开喊话百度

百度搜索Kimi官网前4条都是广告,Kimi不忍了,公开喊话百度

龚进辉
2026-02-02 12:17:36
摊牌了!哈登轰动NBA!火箭有望组建四巨头

摊牌了!哈登轰动NBA!火箭有望组建四巨头

篮球实战宝典
2026-02-03 14:16:21
中国历史上最好的40年,没有任何丰功伟绩

中国历史上最好的40年,没有任何丰功伟绩

霹雳炮
2026-02-01 22:43:27
2026-02-04 12:44:49
Java精选
Java精选
一场永远也演不完的戏
1771文章数 3859关注度
往期回顾 全部

科技要闻

太烦人遭投诉!元宝红包链接被微信屏蔽

头条要闻

卡扎菲儿子被暗杀身亡:4名蒙面人员闯入住所激烈交火

头条要闻

卡扎菲儿子被暗杀身亡:4名蒙面人员闯入住所激烈交火

体育要闻

“也许我的一小步,会成为中国足球的一大步”

娱乐要闻

姜元来在大S墓碑前哭泣,与具俊晔拥抱

财经要闻

35岁入行,先被考证“割韭菜”

汽车要闻

全伪装雪地现身 一汽-大众纯电车型线索曝光

态度原创

艺术
教育
健康
家居
手机

艺术要闻

一篇文章看懂“传统吉祥图案”的寓意

教育要闻

小学老师用AI上课能有多爽?网友:我们小时候哪有这条件

耳石症分类型,症状大不同

家居要闻

灰白意境 光影奏鸣曲

手机要闻

iPhone 18系列再爆料:A20芯片放弃台积电最强N2P,选择基础版2纳米工艺

无障碍浏览 进入关怀版