在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

使用docker搭建minio服務

倩倩 ? 來源:CSDN ? 作者:CSDN ? 2022-09-23 11:08 ? 次閱讀


什么是minio

引用官網:

MinIO是根據GNU Affero通用公共許可證v3.0發布的高性能對象存儲。它與Amazon S3云存儲服務兼容。使用MinIO構建用于機器學習,分析和應用程序數據工作負載的高性能基礎架構。

官網地址:

https://min.io/

文檔地址:

https://docs.min.io/

基于 Spring Boot + MyBatis Plus + Vue & Element 實現的后臺管理系統 + 用戶小程序,支持 RBAC 動態權限、多租戶、數據權限、工作流、三方登錄、支付、短信、商城等功能

  • 項目地址:https://gitee.com/zhijiantianya/ruoyi-vue-pro
  • 視頻教程:https://doc.iocoder.cn/video/

一. 使用docker 搭建minio 服務。

GNU / Linux和macOS

dockerrun-p9000:9000
--nameminio1
-v/mnt/data:/data
-e"MINIO_ROOT_USER=AKIAIOSFODNN7EXAMPLE"
-e"MINIO_ROOT_PASSWORD=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY"
minio/minioserver/data

windows

dockerrun-p9000:9000
--nameminio1
-vD:data:/data
-e"MINIO_ROOT_USER=AKIAIOSFODNN7EXAMPLE"
-e"MINIO_ROOT_PASSWORD=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY"
minio/minioserver/data
  • MINIO_ROOT_USER:為用戶key
  • MINIO_ROOT_PASSWORD:為用戶密鑰

以上搭建的都是單機版的。想要了解分布式 的方式請查看官網文檔。

a62be472-3ae9-11ed-9e49-dac502259ad0.png

這就是在win的docker上運行的。

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

a65eb08c-3ae9-11ed-9e49-dac502259ad0.pnga6875ba4-3ae9-11ed-9e49-dac502259ad0.png

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 實現的后臺管理系統 + 用戶小程序,支持 RBAC 動態權限、多租戶、數據權限、工作流、三方登錄、支付、短信、商城等功能

  • 項目地址:https://gitee.com/zhijiantianya/yudao-cloud
  • 視頻教程:https://doc.iocoder.cn/video/

二. 下面開始搭建springboot 環境

初始化一個springboot項目大家都會,這里不多做介紹。

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


<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-thymeleafartifactId>
dependency>

<dependency>
<groupId>io.miniogroupId>
<artifactId>minioartifactId>
<version>8.2.1version>
dependency>

<dependency>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
<optional>trueoptional>
dependency>

依賴可以官方文檔里找: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
publicclassMinioConfiguration{
privateStringaccessKey;

privateStringsecretKey;

privateStringurl;

privateStringbucketName;

@Bean
publicMinioClientminioClient(){
returnMinioClient.builder()
.endpoint(url)
.credentials(accessKey,secretKey)
.build();
}
}

使用配置屬性綁定進行參數綁定,并初始化一個minio client對象放入容器中。

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

@Component
publicclassMinioComp{

@Autowired
privateMinioClientminioClient;

@Autowired
privateMinioConfigurationconfiguration;

/**
*@description:獲取上傳臨時簽名
*@dateTime:2021/5/1314:12
*/
publicMapgetPolicy(StringfileName,ZonedDateTimetime){
PostPolicypostPolicy=newPostPolicy(configuration.getBucketName(),time);
postPolicy.addEqualsCondition("key",fileName);
try{
Mapmap=minioClient.getPresignedPostFormData(postPolicy);
HashMapmap1=newHashMap<>();
map.forEach((k,v)->{
map1.put(k.replaceAll("-",""),v);
});
map1.put("host",configuration.getUrl()+"/"+configuration.getBucketName());
returnmap1;
}catch(ErrorResponseExceptione){
e.printStackTrace();
}catch(InsufficientDataExceptione){
e.printStackTrace();
}catch(InternalExceptione){
e.printStackTrace();
}catch(InvalidKeyExceptione){
e.printStackTrace();
}catch(InvalidResponseExceptione){
e.printStackTrace();
}catch(IOExceptione){
e.printStackTrace();
}catch(NoSuchAlgorithmExceptione){
e.printStackTrace();
}catch(ServerExceptione){
e.printStackTrace();
}catch(XmlParserExceptione){
e.printStackTrace();
}
returnnull;
}

/**
*@description:獲取上傳文件的url
*@dateTime:2021/5/1314:15
*/
publicStringgetPolicyUrl(StringobjectName,Methodmethod,inttime,TimeUnittimeUnit){
try{
returnminioClient.getPresignedObjectUrl(GetPresignedObjectUrlArgs.builder()
.method(method)
.bucket(configuration.getBucketName())
.object(objectName)
.expiry(time,timeUnit).build());
}catch(ErrorResponseExceptione){
e.printStackTrace();
}catch(InsufficientDataExceptione){
e.printStackTrace();
}catch(InternalExceptione){
e.printStackTrace();
}catch(InvalidKeyExceptione){
e.printStackTrace();
}catch(InvalidResponseExceptione){
e.printStackTrace();
}catch(IOExceptione){
e.printStackTrace();
}catch(NoSuchAlgorithmExceptione){
e.printStackTrace();
}catch(XmlParserExceptione){
e.printStackTrace();
}catch(ServerExceptione){
e.printStackTrace();
}
returnnull;
}


/**
*@description:上傳文件
*@dateTime:2021/5/1314:17
*/
publicvoidupload(MultipartFilefile,StringfileName){
//使用putObject上傳一個文件到存儲桶中。
try{
InputStreaminputStream=file.getInputStream();
minioClient.putObject(PutObjectArgs.builder()
.bucket(configuration.getBucketName())
.object(fileName)
.stream(inputStream,file.getSize(),-1)
.contentType(file.getContentType())
.build());
}catch(ErrorResponseExceptione){
e.printStackTrace();
}catch(InsufficientDataExceptione){
e.printStackTrace();
}catch(InternalExceptione){
e.printStackTrace();
}catch(InvalidKeyExceptione){
e.printStackTrace();
}catch(InvalidResponseExceptione){
e.printStackTrace();
}catch(IOExceptione){
e.printStackTrace();
}catch(NoSuchAlgorithmExceptione){
e.printStackTrace();
}catch(ServerExceptione){
e.printStackTrace();
}catch(XmlParserExceptione){
e.printStackTrace();
}
}
/**
*@description:根據filename獲取文件訪問地址
*@dateTime:2021/5/1711:28
*/
publicStringgetUrl(StringobjectName,inttime,TimeUnittimeUnit){
Stringurl=null;
try{
url=minioClient.getPresignedObjectUrl(GetPresignedObjectUrlArgs.builder()
.method(Method.GET)
.bucket(configuration.getBucketName())
.object(objectName)
.expiry(time,timeUnit).build());
}catch(ErrorResponseExceptione){
e.printStackTrace();
}catch(InsufficientDataExceptione){
e.printStackTrace();
}catch(InternalExceptione){
e.printStackTrace();
}catch(InvalidKeyExceptione){
e.printStackTrace();
}catch(InvalidResponseExceptione){
e.printStackTrace();
}catch(IOExceptione){
e.printStackTrace();
}catch(NoSuchAlgorithmExceptione){
e.printStackTrace();
}catch(XmlParserExceptione){
e.printStackTrace();
}catch(ServerExceptione){
e.printStackTrace();
}
returnurl;
}
}

簡單說明:

  • 使用MultipartFile接收前端文件流,再上傳到minio。
  • 構建一個formData的簽名數據,給前端,讓前端之前上傳到minio。
  • 構建一個可以上傳的臨時URL給前端,前端通過攜帶文件請求該URL進行上傳。
  • 使用filename請求服務端獲取臨時訪問文件的URL。(最長時間為7 天,想要永久性訪問,需要其他設置,這里不做說明。)

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

html>
<html>
<head>
<metacharset="UTF-8">

<linkrel="stylesheet"href="https://unpkg.com/element-ui/lib/theme-chalk/index.css">
<title>上傳圖片title>
head>
<body>
<divid="app">

<el-row:gutter="2">
<el-col:span="8">
<divclass="div-center-class">
<divclass="">
<center><h3>傳統上傳h3>center>
<el-upload
class="upload-demo"
action="#"
drag
:http-request="uploadHandle">
<iclass="el-icon-upload">i>
<divclass="el-upload__text">將文件拖到此處,或<em>點擊上傳em>div>
<divclass="el-upload__tip"slot="tip">只能上傳jpg/png文件,且不超過500kbdiv>
el-upload>
<divv-if="imgUrl">
<img:src="imgUrl"style="width:40px;height:40px">img>
div>
div>
div>
el-col>
<el-col:span="8">
<divclass="div-center-class">
<divclass="">
<center><h3>前端formData直傳h3>center>
<el-upload
class="upload-demo"
action="#"
drag
:http-request="httpRequestHandle">
<iclass="el-icon-upload">i>
<divclass="el-upload__text">將文件拖到此處,或<em>點擊上傳em>div>
<divclass="el-upload__tip"slot="tip">只能上傳jpg/png文件,且不超過500kbdiv>
el-upload>
<divv-if="directUrl">
<img:src="directUrl"style="width:40px;height:40px">img>
div>
div>
div>
el-col>
<el-col:span="8">
<divclass="div-center-class">
<divclass="">
<center><h3>前端Url直傳h3>center>
<el-upload
class="upload-demo"
action="#"
drag
:http-request="UrlUploadHandle">
<iclass="el-icon-upload">i>
<divclass="el-upload__text">將文件拖到此處,或<em>點擊上傳em>div>
<divclass="el-upload__tip"slot="tip">只能上傳jpg/png文件,且不超過500kbdiv>
el-upload>
<divv-if="uploadUrl">
<img:src="uploadUrl"style="width:40px;height:40px">img>
div>
div>
div>
el-col>
el-row>
div>
body>

<scriptsrc="https://unpkg.com/vue/dist/vue.js">script>

<scriptsrc="https://unpkg.com/element-ui/lib/index.js">script>

<scriptsrc="https://unpkg.com/axios/dist/axios.min.js">script>
<script>
newVue({
el:'#app',
data:function(){
return{
imgUrl:'',
directUrl:'',
uploadUrl:''
}
},
methods:{

uploadHandle(options){
let{file}=options;
this.traditionPost(file);
},
traditionPost(file){
_that=this
constform=newFormData();
form.append("fileName",file.name);
form.append("file",file);
this.axiosPost("post","/upload",form).then(function(res){
if(res.status===200){
_that.imgUrl=res.data.data
}else{
alert("上傳失敗!")
}
})
},
getpolicy(file){
_that=this
axios.get('policy?fileName='+file.name)
.then(function(response){
let{xamzalgorithm,xamzcredential,policy,xamzsignature,xamzdate,host}=response.data.data;
letformData=newFormData();
formData.append("key",file.name);
formData.append("x-amz-algorithm",xamzalgorithm);//讓服務端返回200,不設置則默認返回204。
formData.append("x-amz-credential",xamzcredential);
formData.append("policy",policy);
formData.append("x-amz-signature",xamzsignature);
formData.append("x-amz-date",xamzdate);
formData.append("file",file);
//發送POST請求
_that.axiosPost("post",host,formData).then(function(res){
if(res.status===204){
axios.get('url?fileName='+file.name).then(function(res){
_that.directUrl=res.data.data;
})
}else{
alert("上傳失敗!")
}
})
})
},
httpRequestHandle(options){
let{file}=options;
this.getpolicy(file);
},

UrlUploadHandle(options){
let{file}=options;
this.getUploadUrl(file);
},
getUploadUrl(file){
_that=this
console.log(file)
axios.get('uploadUrl?fileName='+file.name)
.then(function(response){
leturl=response.data.data;
//發送put請求
letconfig={'Content-Type':file.type}
_that.axiosPost("put",url,file,config).then(function(res){
if(res.status===200){
axios.get('url?fileName='+file.name).then(function(res){
_that.uploadUrl=res.data.data;
})
}else{
alert("上傳失敗!")
}
})
})
},
//封裝
//axios封裝post請求
axiosPost(method,url,data,config){
letresult=axios({
method:method,
url:url,
data:data,
headers:config
}).then(resp=>{
returnresp
}).catch(error=>{
return"exception="+error;
});
returnresult;
}

}
})
script>
<style>
.div-center-class{
padding:28%0%;
text-align:center;
background:beige;
}
style>
html>

a6a6bd8c-3ae9-11ed-9e49-dac502259ad0.png頁面效果

可以分別體驗不同的實現效果。

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

項目地址是:

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



審核編輯 :李倩


聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 云存儲
    +關注

    關注

    7

    文章

    757

    瀏覽量

    46069
  • 機器學習
    +關注

    關注

    66

    文章

    8425

    瀏覽量

    132771
  • Docker
    +關注

    關注

    0

    文章

    478

    瀏覽量

    11874

原文標題:Spring Boot + minio 實現高性能存儲服務,So Easy~!

文章出處:【微信號:芋道源碼,微信公眾號:芋道源碼】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    docker的基本命令和使用示例

    DotCloud 公司是一家 PAAS 服務提供商,從 docker 的出身也可以看出它的主要功能和方向。
    的頭像 發表于 01-06 15:59 ?69次閱讀

    Flexus 云服務器 X 實例:在 Docker 環境下搭建 java 開發環境

    和開發者精心打造。它以卓越的柔性算力,為我們在 Docker 環境下搭建 java 開發環境提供有力支撐。 一、Flexus 云服務器 X 實例介紹 1.1 Flexus 云服務器 X
    的頭像 發表于 12-30 09:07 ?197次閱讀
    Flexus 云<b class='flag-5'>服務</b>器 X 實例:在 <b class='flag-5'>Docker</b> 環境下<b class='flag-5'>搭建</b> java 開發環境

    企業云服務器平臺設計與搭建

    企業云服務器平臺的設計與搭建是一個復雜但系統的過程,涉及多個環節和因素。主機推薦小編為您整理發布企業云服務器平臺設計與搭建這一過程的詳細闡述。
    的頭像 發表于 12-04 09:51 ?112次閱讀

    docker-compose配置文件內容詳解以及常用命令介紹

    需要的所有服務(例如:Web服務器、數據庫、緩存等)并輕松管理它們。 Docker Compose 使用的三個步驟: 使用 Dockerfile 定義應用程序的環境
    的頭像 發表于 12-02 09:29 ?707次閱讀
    <b class='flag-5'>docker</b>-compose配置文件內容詳解以及常用命令介紹

    搭建開源大語言模型服務的方法

    本文我們將總結5種搭建開源大語言模型服務的方法,每種都附帶詳細的操作步驟,以及各自的優缺點。
    的頭像 發表于 10-29 09:17 ?211次閱讀

    服務搭建步驟

    服務器不僅提供了靈活的資源配置和強大的計算能力,還降低了IT基礎設施的維護成本。下面,rak小編帶您詳細了解云服務搭建的步驟。
    的頭像 發表于 10-09 10:58 ?228次閱讀

    手動構建Docker鏡像的方法

    不推薦使用docker commit命令,而應該使用更靈活、更強大的dockerfile來構建docker鏡像。
    的頭像 發表于 08-05 15:30 ?545次閱讀
    手動構建<b class='flag-5'>Docker</b>鏡像的方法

    ARM平臺實現Docker容器技術

    192.168.10.101:5000/led_flash:v1.0 圖17 Docker版本從1.3.X之后,與Docker Registry交互默認使用https,然而前面搭建的私有倉庫僅提供http
    發表于 07-25 14:36

    ARM平臺實現Docker容器技術

    17Docker版本從1.3.X之后,與Docker Registry交互默認使用https,然而前面搭建的私有倉庫僅提供http服務,因此當與私有倉庫交互時將出現上面的錯誤提示。可通
    發表于 07-17 11:05

    寶塔面板Docker一鍵安裝:部署GPTAcademic,開發私有GPT學術優化工具

    使用寶塔Docker-compose,5分鐘內在海外服務器上搭建gpt_academic。這篇文章講解如何使用寶塔面板的Docker服務
    的頭像 發表于 07-02 11:58 ?2670次閱讀
    寶塔面板<b class='flag-5'>Docker</b>一鍵安裝:部署GPTAcademic,開發私有GPT學術優化工具

    關于Docker 的清理命令集錦

    這篇文章主要介紹了Docker 清理命令集錦,需要的朋友可以參考下 復制代碼代碼如下: docker kill $(docker ps -a -q) ?刪除所有已經停止的容器 復制代碼代碼如下
    的頭像 發表于 06-13 15:56 ?395次閱讀

    分享 | PTP、NTP時間同步服務器的部署與搭建過程

    分享 | PTP、NTP時間同步服務器的部署與搭建過程
    的頭像 發表于 05-15 10:01 ?1079次閱讀
    分享 | PTP、NTP時間同步<b class='flag-5'>服務</b>器的部署與<b class='flag-5'>搭建</b>過程

    ARM平臺實現Docker容器技術

    ,亦可實現虛擬化。容器是完全使用沙箱機制,相互之間不會有任何接口。使用Docker,可像管理應用程序一樣管理基礎結構。通過利用Docker的快速發布、測試和部署代碼的方法,可顯著減少產品開發時間。 ? Docker使用客戶端——
    的頭像 發表于 03-07 13:48 ?822次閱讀
    ARM平臺實現<b class='flag-5'>Docker</b>容器技術

     海外云服務搭建pi節點詳細步驟

     海外云服務搭建pi節點簡單嗎?海外云服務搭建pi節點步驟有哪些?小編為您整理發布海外云服務搭建
    的頭像 發表于 02-21 10:16 ?1143次閱讀

    怎么搭建sdwan?如何搭建SD-WAN網絡服務

    怎么搭建sdwan?如何搭建SD-WAN網絡服務? 隨著云計算、物聯網和移動互聯網等技術的快速發展,企業網絡面臨了更高的帶寬需求、更多的數據傳輸和更強的網絡安全要求。而軟件定義廣域網(SD-WAN
    的頭像 發表于 01-17 16:18 ?4338次閱讀
    主站蜘蛛池模板: 国产特黄一级一片免费| 美女天天操| 狠狠色丁香久久婷婷| 国产婷婷色一区二区三区深爱网| 欧美乱淫| 操久久久| 国产叼嘿视频免费网站| 狂野欧美激情性xxxx| h在线免费视频| 九九热在线免费视频| 亚偷熟乱区视频在线观看| 色妞视频资源在线观看| 久青草国产在线视频_久青草免| 四虎国产精品影库永久免费| 美女三级黄| 亚洲色图欧美激情| 日韩欧美亚洲综合一区二区| 男人的天堂在线视频| 日本黄色大片在线播放视频免费观看 | 日本不卡一区在线| 在线观看www妖精免费福利视频| 四虎久久影院| 毛片网子| 久久99免费| 最新大黄网站免费| 国产黄色在线免费观看| 国产主播精品在线| 亚洲午夜精品在线| 国产精品久久久亚洲456| 国内久久久久高清影视| 一区二区三区在线观看免费| 亚洲国产成人在人网站天堂| 你懂的网站在线| 一级片免费看| 91午夜剧场| 永井玛丽亚中文在线观看视频| 一级做a爰片久久毛片免费看| 色视频观看| 成人国产精品毛片| 午夜视频在线观看www中文| 国产高清网站|