SpringBoot2 整合MinIO中介軟體,實現檔案便捷管理
阿新 • • 發佈:2020-07-27
本文原始碼:[GitHub·點這裡](https://github.com/cicadasmile/middle-ware-parent) || [GitEE·點這裡](https://gitee.com/cicadasmile/middle-ware-parent)
# 一、MinIO簡介
## 1、基礎描述
MinIO是一個開源的物件儲存服務。適合於儲存大容量非結構化的資料,例如圖片、視訊、日誌檔案、備份資料和容器/虛擬機器映象等,而一個物件檔案可以是任意大小,從幾kb到最大5T不等。
MinIO是一個非常輕量的服務,可以很簡單的和其他應用的結合,類似 NodeJS, Redis 或者 MySQL。
## 2、儲存機制
MinIO使用按物件的嵌入式擦除編碼保護資料,該編碼以彙編程式碼編寫,可提供最高的效能。MinIO使用Reed-Solomon程式碼將物件劃分為n/2個數據和n / 2個奇偶校驗塊-儘管可以將它們配置為任何所需的冗餘級別。 這意味著在12個驅動器設定中,將一個物件分片為6個數據和6個奇偶校驗塊。即使丟失了多達5個((n/2)–1)個驅動器(無論是奇偶校驗還是資料),仍然可以從其餘驅動器可靠地重建資料。MinIO的實現可確保即使丟失或無法使用多個裝置,也可以讀取物件或寫入新物件。最後,MinIO的擦除程式碼位於物件級別,並且可以一次修復一個物件。
# 二、MinIO環境搭建
## 1、安裝包下載
```
https://dl.min.io/server/minio/release/linux-amd64/minio
```
建議使用某雷下載,速度會快點,下載包上傳到`/opt/minioconfig/run`目錄下。
## 2、建立資料儲存目錄
```
mkdir -p /data/minio/data
```
## 3、服務啟動
啟動並指定資料存放地址
```
/opt/minioconfig/run/minio server /data/minio/data/
```
輸出日誌
```
Endpoint: http://localhost:9000 http://127.0.0.1:9000
AccessKey: minioadmin
SecretKey: minioadmin
```
這裡就是登入地址和賬號密碼。
# 三、整合SpringBoot環境
## 1、基礎依賴
```xml
```
## 2、基礎配置
配置要素:地址和埠,登入名,密碼,HTML儲存桶,圖片儲存桶。
![](https://img2020.cnblogs.com/blog/1691717/202007/1691717-20200727201649334-883250186.jpg)
```yml
minio:
endpoint: http://192.168.72.133:9000
accessKey: minioadmin
secretKey: minioadmin
bucketNameHtml: html
bucketNameImage: image
```
檔案上傳之後,可以基於檔案地址直接訪問,但是需要在MinIO中配置檔案的讀寫許可權:
![](https://img2020.cnblogs.com/blog/1691717/202007/1691717-20200727201707020-619042278.jpg)
## 3、配置引數類
```java
@Component
@ConfigurationProperties(prefix = "minio")
public class ParamConfig {
private String endpoint ;
private String accessKey ;
private String secretKey ;
private String bucketNameHtml ;
private String bucketNameImage ;
// 省略 get 和 set方法
}
```
## 4、基於MinIO配置類
封裝MinIO客戶端連線工具,檔案上傳的基礎方法,返回檔案在MinIO服務上的URL地址。
```java
import io.minio.MinioClient;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import javax.annotation.Resource;
@Component
public class MinIOConfig {
private static final Logger LOGGER = LoggerFactory.getLogger(MinIOConfig.class) ;
@Resource
private ParamConfig paramConfig ;
private MinioClient minioClient ;
/**
* 初始化 MinIO 客戶端
*/
@PostConstruct
private void init(){
try {
minioClient = new MinioClient(paramConfig.getEndpoint(),
paramConfig.getAccessKey(),
paramConfig.getSecretKey());
} catch (Exception e) {
e.printStackTrace();
LOGGER.info("MinIoClient init fail ...");
}
}
/**
* 上傳 頁面
*/
public String uploadHtml (String fileName, String filePath) throws Exception {
minioClient.putObject(paramConfig.getBucketNameHtml(),fileName,filePath);
return paramConfig.getEndpoint()+"/"+paramConfig.getBucketNameHtml()+"/"+fileName ;
}
/**
* 上傳 圖片
*/
public String uploadImg (String imgName, String imgPath) throws Exception {
minioClient.putObject(paramConfig.getBucketNameImage(),imgName,imgPath);
return paramConfig.getEndpoint()+"/"+paramConfig.getBucketNameImage()+"/"+imgName ;
}
}
```
## 5、服務實現
提供兩個基礎方法:HTML和圖片上傳,儲存在不同位置。
```java
import com.minio.file.config.MinIOConfig;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
@Service
public class UploadServiceImpl implements UploadService {
@Resource
private MinIOConfig minIOConfig ;
// 上傳 ,返回伺服器地址
@Override
public String uploadHtml(String fileName, String filePath) throws Exception {
return minIOConfig.uploadHtml(fileName,filePath);
}
// 上傳 ,返回伺服器地址
@Override
public String uploadImg(String imgName, String imgPath) throws Exception {
return minIOConfig.uploadImg(imgName,imgPath);
}
}
```
上傳之後,基於瀏覽器訪問介面返回的url,檢視效果:
![](https://img2020.cnblogs.com/blog/1691717/202007/1691717-20200727201727635-676465520.jpg)
# 四、原始碼地址
```
GitHub·地址
https://github.com/cicadasmile/middle-ware-parent
GitEE·地址
https://gitee.com/cicadasmile/middle-ware-parent
```
![](https://img2018.cnblogs.com/blog/1691717/201908/1691717-20190823075428183-1996768914.png)
**推薦閱讀:SpringBoot進階系列**
|序號|文章標題|
|:---:|:---|
|01|[Boot2 整合 shard-jdbc 中介軟體,實現資料分庫分表](https://mp.weixin.qq.com/s/XNFjOyzUfeR6zMrlvNPB8g)|
|02|[Boot2 整合 JavaMail ,實現非同步傳送郵件功能](https://mp.weixin.qq.com/s/hadAFqK-w394K4XPWplANw)|
|03|[Boot2 整合 RocketMQ ,實現請求非同步處理](https://mp.weixin.qq.com/s/uF29K8gzv7qHYk-K2pQkpQ)|
|04|[Boot2 整合 Swagger2 ,構建介面管理介面](https://mp.weixin.qq.com/s/ztmmC3bKlSfUl5Ec3qUPOQ)|
|05|[Boot2 整合 QuartJob ,實現定時器實時管理](https://mp.weixin.qq.com/s/CKf8JZEKx8HMidkYKRKo_w)|
|06|[Boot2 整合 Redis叢集 ,實現訊息佇列場景](https://mp.weixin.qq.com/s/nU6hZY17cO7BF68YyI78Yw)|
|07|[Boot2 整合 Dubbo框架 ,實現RPC服務遠端呼叫](https://mp.weixin.qq.com/s/uKvgLpASyJYC9mafO05Uvw)|
|08|[Boot2 整合 ElasticSearch框架,實現高效能搜尋引擎](https://mp.weixin.qq.com/s/ZUj4qy7qHgmfYPTdimO-Hw)|
|09|[Boot2 整合 JWT 框架,解決Token跨域驗證問題](https://mp.weixin.qq.com/s/CYvsho_kCwUndTuDkDOvOg)|
|10|[Boot2 整合 FastDFS 中介軟體,實現檔案分佈管理](https://mp.weixin.qq.com/s/c9DsOUF545oqD1Hft5DcQw)|
|11|[Boot2 整合 Shiro 框架,實現使用者許可權管理](https://mp.weixin.qq.com/s/3tyPcvfUzv6BI8KWkLZ53w)|
|12|[Boot2 整合 Security 框架,實現使用者許可權管理](https://mp.weixin.qq.com/s/7GYddhPSf3C7ZSEqF7OZKw)|
|13|[Boot2 整合 ClickHouse資料庫,實現資料高效能查詢分析](https://mp.weixin.qq.com/s/KoNVUAe1ttC9AX7JAMqfOA)|
|14|[Boot2 整合 Drools規則引擎,實現高效的業務規則](https://mp.weixin.qq.com/s/fBDv5N-5RxcuWMi6He3p4Q)|
|15|[Boot2 整合 多資料來源,配置MybatisPlus增強外掛](https://mp.weixin.qq.com/s/B738xzn848_YORt8qT-X5Q)|
|16|[Boot2 整合 Zookeeper元件,管理架構中服務協調](https://mp.weixin.qq.com/s/zjw-A7u-chGZhNgwuUsEPw)|
|17|[Boot2 整合Nacos元件,環境搭建和入門案例詳解](https://mp.weixin.qq.com/s/jfkEtqFus8v_JXNrRSHYOA)|
|18|[檔案系統(01):基於Boot2框架,管理Excel和PDF](https://mp.weixin.qq.com/s/YQueOKCmAkVASHKtwz6pgw)|
|18|[檔案系統(02):基於Boot2框架,管理Xml和CSV](https://mp.weixin.qq.com/s/tIHykTG0ey1dwnTwzYwuig)|
|19|[Boot2 整合 Kafka元件,應用案例和流程詳解](https://mp.weixin.qq.com/s/XP2LhioxBGk7z_vW1XN2nQ)|
|20|[Boot2 整合 ElasticJob框架,定製化管理流程](https://mp.weixin.qq.com/s/eFKq3zKksbwzHZ3d81HaZw)|
|21|[Boot2 整合JTA元件,多資料來源事務管理](https://mp.weixin.qq.com/s/6zR4JXDnoinzLDUaENWVSA)|
|22|[Boot2 整合FreeMarker模板,完成頁面靜態化處理](https://mp.weixin.qq.com/s/HwFT_E7v0ms_jQWP