国产av一二三区|日本不卡动作网站|黄色天天久久影片|99草成人免费在线视频|AV三级片成人电影在线|成年人aV不卡免费播放|日韩无码成人一级片视频|人人看人人玩开心色AV|人妻系列在线观看|亚洲av无码一区二区三区在线播放

網(wǎng)易首頁 > 網(wǎng)易號(hào) > 正文 申請(qǐng)入駐

SpringBoot + minio實(shí)現(xiàn)高性能存儲(chǔ)服務(wù),So Easy ~ Github Star 51.7K+

0
分享至

Java精選面試題(微信小程序):5000+道面試題和選擇題,真實(shí)面經(jīng),簡歷模版,包含Java基礎(chǔ)、并發(fā)、JVM、線程、MQ系列、Redis、Spring系列、Elasticsearch、Docker、K8s、Flink、Spark、架構(gòu)設(shè)計(jì)、大廠真題等,在線隨時(shí)刷題!

什么是minio

MinIO是一個(gè)基于Go實(shí)現(xiàn)的高性能、兼容S3協(xié)議的對(duì)象存儲(chǔ)。它采用GNU AGPL v3開源協(xié)議,項(xiàng)目地址是https://github.com/minio/minio。

引用官網(wǎng):

MinIO是根據(jù)GNU Affero通用公共許可證v3.0發(fā)布的高性能對(duì)象存儲(chǔ)。它與Amazon S3云存儲(chǔ)服務(wù)兼容。使用MinIO構(gòu)建用于機(jī)器學(xué)習(xí),分析和應(yīng)用程序數(shù)據(jù)工作負(fù)載的高性能基礎(chǔ)架構(gòu)。

官網(wǎng)地址:

https://min.io/

文檔地址:

https://docs.min.io/
一. 使用docker 搭建minio 服務(wù)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:為用戶密鑰

以上搭建的都是單機(jī)版的。想要了解分布式 的方式請(qǐng)查看官網(wǎng)文檔。

這就是在win的docker上運(yùn)行的。

更多開源項(xiàng)目:https://www.yoodb.com/projects/springboot-user-manger.html

當(dāng)啟動(dòng)后在瀏覽器訪問http://localhost:9000就可以訪問minio的圖形化界面了,如圖所示:

二. 下面開始搭建springboot 環(huán)境

初始化一個(gè)springboot項(xiàng)目大家都會(huì),這里不多做介紹。

主要是介紹需要引入的依賴:

              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初始化是設(shè)置的,密鑰相同     secret-key: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY     url: http://localhost:9000     bucket-name: wdhcr   thymeleaf:     cache: false

創(chuàng)建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();     } }

使用配置屬性綁定進(jìn)行參數(shù)綁定,并初始化一個(gè)minio client對(duì)象放入容器中。

下面就是我封裝的minio client 操作minio的簡單方法的組件。

@Component public class MinioComp {     @Autowired     private MinioClient minioClient;     @Autowired     private MinioConfiguration configuration;     /**      * @description: 獲取上傳臨時(shí)簽名,公眾 號(hào)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,公眾 號(hào)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上傳一個(gè)文件到存儲(chǔ)桶中。         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: 根據(jù)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。

  • 構(gòu)建一個(gè)formData的簽名數(shù)據(jù),給前端,讓前端之前上傳到minio。

  • 構(gòu)建一個(gè)可以上傳的臨時(shí)URL給前端,前端通過攜帶文件請(qǐng)求該URL進(jìn)行上傳。

  • 使用filename請(qǐng)求服務(wù)端獲取臨時(shí)訪問文件的URL。(最長時(shí)間為7 天,想要永久性訪問,需要其他設(shè)置,這里不做說明。)

  • 推薦,公眾 號(hào)Java精選,回復(fù)java面試,獲取面試資料,支持在線刷題。

下面展示頁面html,使用的是VUE+element-ui進(jìn)行渲染。

    "UTF-8">         "stylesheet" >     上傳圖片 "app" >     "2" >         "8" >             "div-center-class" >                 "" >                     傳統(tǒng)上傳                                                upload-demo"                             action= "#"                             drag                             :http-request= "uploadHandle" >                         "el-icon-upload">                         "el-upload__text" >將文件拖到此處,或點(diǎn)擊上傳                         "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" >將文件拖到此處,或點(diǎn)擊上傳                         "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" >將文件拖到此處,或點(diǎn)擊上傳                         "el-upload__tip"  slot= "tip" >只能上傳jpg/png文件,且不超過500kb                                         "uploadUrl" >                         "uploadUrl" style="width: 40px;height: 40px">                                                            

頁面的效果就如上圖所示。

可以分別體驗(yàn)不同的實(shí)現(xiàn)效果。

以上就是使用springboot搭建基于minio的高性能存儲(chǔ)服務(wù)的全部步驟了。

本項(xiàng)目地址:

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

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

公眾號(hào)“Java精選”所發(fā)表內(nèi)容注明來源的,版權(quán)歸原出處所有(無法查證版權(quán)的或者未注明出處的均來自網(wǎng)絡(luò),系轉(zhuǎn)載,轉(zhuǎn)載的目的在于傳遞更多信息,版權(quán)屬于原作者。如有侵權(quán),請(qǐng)聯(lián)系,筆者會(huì)第一時(shí)間刪除處理!

最近有很多人問,有沒有讀者交流群!加入方式很簡單,公眾號(hào)Java精選,回復(fù)“加群”,即可入群!

文章有幫助的話,點(diǎn)在看,轉(zhuǎn)發(fā)吧!

特別聲明:以上內(nèi)容(如有圖片或視頻亦包括在內(nèi))為自媒體平臺(tái)“網(wǎng)易號(hào)”用戶上傳并發(fā)布,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。

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.

相關(guān)推薦
熱點(diǎn)推薦
尤爾曼德:我們在聯(lián)賽階段戰(zhàn)勝了本菲卡、曼城,這表現(xiàn)可接受

尤爾曼德:我們在聯(lián)賽階段戰(zhàn)勝了本菲卡、曼城,這表現(xiàn)可接受

懂球帝
2026-01-29 16:24:06
清華美女教授在三亞突然去世:事發(fā)全過程披露,學(xué)生披露大量隱情

清華美女教授在三亞突然去世:事發(fā)全過程披露,學(xué)生披露大量隱情

博士觀察
2026-01-28 20:46:56
商業(yè)航天概念震蕩拉升 航天科技直線漲停

商業(yè)航天概念震蕩拉升 航天科技直線漲停

每日經(jīng)濟(jì)新聞
2026-01-29 11:06:08
被曝“丑聞”才2小時(shí),交警回應(yīng)金晨肇事逃逸,惡心的一幕出現(xiàn)了

被曝“丑聞”才2小時(shí),交警回應(yīng)金晨肇事逃逸,惡心的一幕出現(xiàn)了

靜若梨花
2026-01-29 16:25:55
“流氓有文化更可怕”,退休老干部頻繁聯(lián)系女幼師,聊天記錄曝光

“流氓有文化更可怕”,退休老干部頻繁聯(lián)系女幼師,聊天記錄曝光

妍妍教育日記
2026-01-27 19:58:28
隨著吉達(dá)國民4-0,費(fèi)哈3-1,沙特聯(lián)積分榜出爐:C羅率隊(duì)跌至第3

隨著吉達(dá)國民4-0,費(fèi)哈3-1,沙特聯(lián)積分榜出爐:C羅率隊(duì)跌至第3

凌空倒鉤
2026-01-29 07:56:44
15年前,徐帆砸了沈星的豪宅。 15年后沈星還住在4500萬房子里。

15年前,徐帆砸了沈星的豪宅。 15年后沈星還住在4500萬房子里。

歲月有情1314
2026-01-29 13:47:16
把水賣給酒鬼?河南一藥企“不務(wù)正業(yè)”,一年掙了40億

把水賣給酒鬼?河南一藥企“不務(wù)正業(yè)”,一年掙了40億

毒sir財(cái)經(jīng)
2026-01-28 15:27:05
退位后的李淵日子有多難過?李世民:您的宮女太多,不如回家嫁人

退位后的李淵日子有多難過?李世民:您的宮女太多,不如回家嫁人

掠影后有感
2026-01-29 10:44:30
這次軍委的動(dòng)作,真是讓人倒吸一口涼氣!

這次軍委的動(dòng)作,真是讓人倒吸一口涼氣!

百態(tài)人間
2026-01-27 15:31:38
他是五代十國最好皇帝,計(jì)劃30年開創(chuàng)太平年,可老天只給他5年半

他是五代十國最好皇帝,計(jì)劃30年開創(chuàng)太平年,可老天只給他5年半

長風(fēng)文史
2026-01-29 14:46:17
還八百就八百,你可知八百精兵意味著什么?

還八百就八百,你可知八百精兵意味著什么?

小豫講故事
2026-01-28 06:00:07
開年大瓜!國產(chǎn)女優(yōu)上岸成功嫁為人妻,拍短視頻后遭惡語相向

開年大瓜!國產(chǎn)女優(yōu)上岸成功嫁為人妻,拍短視頻后遭惡語相向

社會(huì)醬
2026-01-16 16:54:49
特朗普:她不會(huì)辭職;我可能面臨被彈劾

特朗普:她不會(huì)辭職;我可能面臨被彈劾

揚(yáng)子晚報(bào)
2026-01-28 07:23:00
凍干草莓檢出鎘超標(biāo)、國家禁用農(nóng)藥克百威殘留?采購企業(yè)投訴,市監(jiān)認(rèn)為沒標(biāo)準(zhǔn)不立案

凍干草莓檢出鎘超標(biāo)、國家禁用農(nóng)藥克百威殘留?采購企業(yè)投訴,市監(jiān)認(rèn)為沒標(biāo)準(zhǔn)不立案

大風(fēng)新聞
2026-01-28 19:04:04
自己在家養(yǎng)發(fā)半年:頭發(fā)越來越多,白的越來越少,我做對(duì)了3件事

自己在家養(yǎng)發(fā)半年:頭發(fā)越來越多,白的越來越少,我做對(duì)了3件事

君笙的拂兮
2026-01-28 16:47:18
俄邀澤連斯基赴莫斯科和普京會(huì)面!總統(tǒng)助理:來吧,保證你的安全

俄邀澤連斯基赴莫斯科和普京會(huì)面!總統(tǒng)助理:來吧,保證你的安全

娛樂督察中
2026-01-29 16:00:30
價(jià)格大跳水!主力車型直降超15萬,中年男人的夢中豪車撐不住了?

價(jià)格大跳水!主力車型直降超15萬,中年男人的夢中豪車撐不住了?

財(cái)經(jīng)八卦
2026-01-28 20:05:03
國鐵集團(tuán):12306客戶端沒與任何第三方平臺(tái)合作,不便上網(wǎng)的老年人可電話購票

國鐵集團(tuán):12306客戶端沒與任何第三方平臺(tái)合作,不便上網(wǎng)的老年人可電話購票

紅星新聞
2026-01-29 11:19:02
腸癌手術(shù)一做,人生倒計(jì)時(shí)就開始了?醫(yī)生實(shí)話實(shí)說:這5點(diǎn)要注意

腸癌手術(shù)一做,人生倒計(jì)時(shí)就開始了?醫(yī)生實(shí)話實(shí)說:這5點(diǎn)要注意

荷蘭豆愛健康
2026-01-29 13:04:32
2026-01-29 17:16:49
Java精選
Java精選
一場永遠(yuǎn)也演不完的戲
1768文章數(shù) 3859關(guān)注度
往期回顧 全部

科技要聞

周亞輝的AI新賭局:國內(nèi)太卷 出海另起爐灶

頭條要聞

女大學(xué)生到東北游玩暈倒雪地凍傷 三根手指或面臨截肢

頭條要聞

女大學(xué)生到東北游玩暈倒雪地凍傷 三根手指或面臨截肢

體育要聞

詹姆斯哭了!騎士視頻致敬41歲超巨

娛樂要聞

張譯不再隱瞞!公開回應(yīng)退圈息影真相

財(cái)經(jīng)要聞

崔東樹:中國汽車未來年銷或達(dá)5000萬輛

汽車要聞

車長超5米還帶后輪轉(zhuǎn)向 比亞迪海豹08/海獅08將亮相

態(tài)度原創(chuàng)

親子
數(shù)碼
房產(chǎn)
藝術(shù)
手機(jī)

親子要聞

一個(gè)現(xiàn)象:縣城里的孕婦越來越少了

數(shù)碼要聞

這種電熱水袋國家早已禁售:別再用了

房產(chǎn)要聞

萬科難眠夜:前董事長郁亮失聯(lián),三筆債券靠深鐵才通過展期

藝術(shù)要聞

梵高全集(高清350張)震撼……

手機(jī)要聞

游戲直播神器!iQOO 15 Ultra支持一鍵投屏 開播0門檻

無障礙瀏覽 進(jìn)入關(guān)懷版