springboot整合minio實(shí)現(xiàn)文件存儲(chǔ)功能
一,minio介紹
MinIO 是一個(gè)基于Apache License v2.0開源協(xié)議的對(duì)象存儲(chǔ)服務(wù)。它兼容亞馬遜S3云存儲(chǔ)服務(wù)接口,非常適合于存儲(chǔ)大容量非結(jié)構(gòu)化的數(shù)據(jù),例如圖片、視頻、日志文件、備份數(shù)據(jù)和容器/虛擬機(jī)鏡像等,而一個(gè)對(duì)象文件可以是任意大小,從幾kb到最大5T不等。
MinIO是一個(gè)非常輕量的服務(wù),可以很簡(jiǎn)單的和其他應(yīng)用的結(jié)合,類似 NodeJS, Redis 或者 MySQL。
官方文檔:MinIO對(duì)象存儲(chǔ) Kubernetes — MinIO中文文檔 | MinIO Kubernetes中文文檔 舊一點(diǎn)
MinIO Object Storage for Kubernetes — MinIO Object Storage for Kubernetes 新
應(yīng)用場(chǎng)景
單主機(jī)單硬盤模式

單主機(jī)多硬盤模式

多主機(jī)多硬盤分布式

特點(diǎn)
· 高性能:作為高性能對(duì)象存儲(chǔ),在標(biāo)準(zhǔn)硬件條件下它能達(dá)到55GB/s的讀、35GB/s的寫速率
· 可擴(kuò)容:不同MinIO集群可以組成聯(lián)邦,并形成一個(gè)全局的命名空間,并跨越多個(gè)數(shù)據(jù)中心
· 云原生:容器化、基于K8S的編排、多租戶支持
· Amazon S3兼容:Minio使用Amazon S3 v2 / v4 API??梢允褂肕inio SDK,Minio Client,AWS SDK和AWS CLI訪問(wèn)Minio服務(wù)器。
· 可對(duì)接后端存儲(chǔ): 除了Minio自己的文件系統(tǒng),還支持DAS、 JBODs、NAS、Google云存儲(chǔ)和Azure Blob存儲(chǔ)。
· SDK支持: 基于Minio輕量的特點(diǎn),它得到類似Java、Python或Go等語(yǔ)言的sdk支持
· Lambda計(jì)算: Minio服務(wù)器通過(guò)其兼容AWS SNS / SQS的事件通知服務(wù)觸發(fā)Lambda功能。支持的目標(biāo)是消息隊(duì)列,如Kafka,NATS,AMQP,MQTT,Webhooks以及Elasticsearch,Redis,Postgres和MySQL等數(shù)據(jù)庫(kù)。
· 有操作頁(yè)面
· 功能簡(jiǎn)單: 這一設(shè)計(jì)原則讓MinIO不容易出錯(cuò)、更快啟動(dòng)
· 支持糾刪碼:MinIO使用糾刪碼、Checksum來(lái)防止硬件錯(cuò)誤和靜默數(shù)據(jù)污染。在最高冗余度配置下,即使丟失1/2的磁盤也能恢復(fù)數(shù)據(jù)**!**
存儲(chǔ)機(jī)制
Minio使用糾刪碼erasure code和校驗(yàn)和checksum。 即便丟失一半數(shù)量(N/2)的硬盤,仍然可以恢復(fù)數(shù)據(jù)。
糾刪碼是一種恢復(fù)丟失和損壞數(shù)據(jù)的數(shù)學(xué)算法**。**
二,搭建安裝
docker pull minio/minio 新版本: docker run \ -p 9000:9000 \ -p 9001:9001 \ --name minio \ -d --restart=always \ -e "MINIO_ROOT_USER=admin" \ -e "MINIO_ROOT_PASSWORD=admin123456" \ -v /home/data:/data \ -v /home/config:/root/.minio \ minio/minio server /data --console-address ":9001"
瀏覽器訪問(wèn):http://IP:9000/minio/login,如圖:

三,使用
3.1引入依賴
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>8.2.0</version>
</dependency>3.2創(chuàng)建文件上傳的controller FileController
注意:一些參數(shù)不能寫死,需要寫到配置文件里面進(jìn)行動(dòng)態(tài)讀取
minio: endpointUrl: http://192.168.17.166:9000 accessKey: admin secreKey: admin123456 bucketName: gmall
@RestController
@RequestMapping("/admin/product")
public class FileController {
//由于參數(shù)不固定,因此需要從配置文件讀取,有兩種方式①@value注解②創(chuàng)建實(shí)體類使用@configurationproperties注解指定前綴注入
@Value("${minio.endpointUrl}")
private String endpointUrl; //文件服務(wù)器登錄地址
@Value("${minio.accessKey}")
private String accessKey; //用戶名
@Value("${minio.secreKey}")
private String secreKey; //密碼
@Value("${minio.bucketName}")
private String bucketName; //儲(chǔ)存桶名稱
/**
* @Description: 上傳圖片到minio文件服務(wù)器
* @Param: MultipartFile
* @return:
* @Author: Mr.Zhan
* @Date: 2022/3/28 17:59
*/
@PostMapping("/fileUpload")
public Result fileUpload(MultipartFile file) {
String result =null;
try {
// 創(chuàng)建minio的客戶端
MinioClient minioClient =
MinioClient.builder()
.endpoint(endpointUrl) //指定文件服務(wù)器地址,用戶名,密碼
.credentials(accessKey, secreKey)
.build();
// 判斷存儲(chǔ)桶是否存在
boolean found =
minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());
if (!found) {
// 不存在則創(chuàng)建一個(gè)桶
minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());
} else {
throw new GmallException("存儲(chǔ)桶已經(jīng)存在", 20001);
}
//準(zhǔn)備上傳的圖片名稱
String fileName = System.currentTimeMillis() + UUID.randomUUID().toString().replaceAll("-", "") + file.getOriginalFilename();
//使用流上傳文件
/*
* ①bucketName 存儲(chǔ)桶名字
* ②fileName 文件名稱
* ③ file.getInputStream() 文件流
* ④file.getSize()文件大小
* file.getContentType() 文件類型
* */
minioClient.putObject(
PutObjectArgs.builder().bucket(bucketName).object(fileName).stream(
file.getInputStream(), file.getSize(), -1)
.contentType(file.getContentType())
.build());
result=endpointUrl + "/" + bucketName + "/" + fileName;
} 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 Result.ok(result);
}
}
3.3登陸控制臺(tái)設(shè)置桶的狀態(tài)為公開
四,注意
注意:文件上傳時(shí),需要調(diào)整一下linux 服務(wù)器的時(shí)間與windows 時(shí)間一致! 第一步:安裝ntp服務(wù) yum -y install ntp 第二步:開啟開機(jī)啟動(dòng)服務(wù) systemctl enable ntpd 第三步:?jiǎn)?dòng)服務(wù) systemctl start ntpd 第四步:更改時(shí)區(qū) timedatectl set-timezone Asia/Shanghai 第五步:?jiǎn)⒂胣tp同步 timedatectl set-ntp yes 第六步:同步時(shí)間 ntpq -p
以上就是springboot整合minio實(shí)現(xiàn)文件存儲(chǔ)功能的詳細(xì)內(nèi)容,更多關(guān)于springboot minio文件存儲(chǔ)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java基礎(chǔ)之線程鎖相關(guān)知識(shí)總結(jié)
今天給大家?guī)?lái)的是關(guān)于Java線程的相關(guān)知識(shí),文章圍繞著Java線程鎖展開,文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下2021-06-06
Spring-Web與Spring-WebFlux沖突問(wèn)題解決
Spring WebFlux是一套全新的Reactive Web技術(shù)棧,實(shí)現(xiàn)完全非阻塞,支持Reactive Streams背壓等特性,這篇文章主要給大家介紹了關(guān)于Spring-Web與Spring-WebFlux沖突問(wèn)題解決的相關(guān)資料,需要的朋友可以參考下2024-04-04
JavaSE基礎(chǔ)之反射機(jī)制(反射Class)詳解
反射機(jī)制有什么用?通過(guò)java語(yǔ)言中的反射機(jī)制可以操作字節(jié)碼文件,可以讀和修改字節(jié)碼文件。所以本文將為大家講講反射機(jī)制的使用,需要的可以參考一下2022-09-09
java 使用JDBC構(gòu)建簡(jiǎn)單的數(shù)據(jù)訪問(wèn)層實(shí)例詳解
以下是如何使用JDBC構(gòu)建一個(gè)數(shù)據(jù)訪問(wèn)層,包括數(shù)據(jù)轉(zhuǎn)換(將從數(shù)據(jù)庫(kù)中查詢的數(shù)據(jù)封裝到對(duì)應(yīng)的對(duì)象中……),數(shù)據(jù)庫(kù)的建立,以及如何連接到數(shù)據(jù)庫(kù),需要的朋友可以參考下2016-11-11
Java使用FreeMarker實(shí)現(xiàn)動(dòng)態(tài)生成Word文檔
在電纜行業(yè),生成供貨清單是一項(xiàng)常見(jiàn)但繁瑣的任務(wù),這篇文章將介紹如何使用現(xiàn)代Java技術(shù)棧自動(dòng)化這一過(guò)程,文中的示例代碼簡(jiǎn)潔易懂,感興趣的小伙伴可以參考一下2025-05-05
springboot中PostMapping正常接收json參數(shù)后返回404問(wèn)題
這篇文章主要介紹了springboot中PostMapping正常接收json參數(shù)后返回404問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-05-05

