一. MinIO概述
官網地址:https://minio.org.cn
MinIO是一款基于Apache License v2.0開源協(xié)議的分布式文件系統(tǒng)(或者叫對象存儲服務),可以做為云存儲的解決方案用來保存海量的圖片、視頻、文檔等。由于采用Golang實現(xiàn),服務端可以工作在Windows、Linux、 OS X和FreeBSD上。配置簡單,基本是復制可執(zhí)行程序,單行命令就可以運行起來。
MinIO兼容亞馬遜S3(Simple Storage Service,簡單存儲服務)云存儲服務接口,非常適合于存儲大容量非結構化的數(shù)據,例如圖片、視頻、日志文件、備份數(shù)據和容器/虛擬機鏡像等,而且每個對象文件可以是任意大小,從幾kb到最大5T不等。
?MinIO特點:
1. 高性能:作為高性能對象存儲,在標準硬件條件下它能達到55GB/s的讀、35GB/s的寫速率;
2. 可擴容:不同MinIO集群可以組成聯(lián)邦,并形成一個全局的命名空間,并跨越多個數(shù)據中心;
3. SDK支持: 基于Minio輕量的特點,它得到類似Java、Python或Go等語言的sdk支持;
4. 支持糾刪碼:MinIO使用糾刪碼、Checksum來防止硬件錯誤和靜默數(shù)據污染。在最高冗余度配? 置下,即使丟失1/2的磁盤也能恢復數(shù)據;
MinIO基本概念:
- bucket(桶) :類似文件系統(tǒng)的目錄(文件夾);
- Object : 類似文件系統(tǒng)的文件;
- Keys :類似文件名;
- MINIO_ACCESS_KEY:訪問key,類似賬號;
- MINIO_SECRET_KEY:秘鑰,類似密碼。
二. Dokcer安裝Minio
2.1 創(chuàng)建文件夾
在home/docker/minio文件夾下創(chuàng)建兩個文件夾,分別是data、config,用于掛載容器中的數(shù)據卷。
mkdir home/docker/minio/data
mkdir home/docker/minio/config
2.1 拉取鏡像
docker pull minio/minio
2.3 啟動容器
docker run -p 9000:9000 -p 9001:9001\
--name minio \
-d --restart=always \
-e "MINIO_ROOT_USER=minio" \
-e "MINIO_ROOT_PASSWORD=minio123" \
-v /home/docker/minio/data:/data \
-v /home/docker/minio/config \
minio/minio server \
/data --console-address ":9001" -address ":9000"
參數(shù)說明
- -p:MinIO 服務會暴露 9000 端口作為API端口,9001 端口為可視化管理頁面端口
- -v :掛載數(shù)據卷,將 minio 容器內存儲的數(shù)據、配置文件映射到宿主機
- -e MINIO_ROOT_USER:設置 root 用戶名
- -e MINIO_ROOT_PASSWORD:設置 root 的密碼,長度至少 8 位
- --console-address:指定可視化界面端口
- -address:指定服務端口
記得開放安全組!
2.4 查看日志
docker logs minio容器id
通過以上命令查看 minio 日志,會輸出以下內容:
我們可以通過日志中的Console地址來訪問可視化界面。
三.訪問Minio
登錄成功后,可以創(chuàng)建桶
?此時在桶列表會會出現(xiàn)剛剛創(chuàng)建的桶,點擊Manage,設置桶的訪問策略,修改為 Public 公共策略,這樣 minio 中的文件才能被外界訪問
?并可以直接在桶中上傳文件。
四. 整合Springboot完成文件上傳
4.1創(chuàng)建springboot工程
4.2?導入相關依賴
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<!-- 必須要導入OKhttp的依賴 -->
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>4.8.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/io.minio/minio -->
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>8.5.7</version>
</dependency>
<!--web-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
4.3 yaml中配置 Minio
在 yaml 中新增以下配置:
minio:
accessKey: minio # 訪問Key
secretKey: minio123 # 密鑰
bucket: test
endpoint: http://xxx.x.x.x:9000 # ip:api端口
readPath: http://xxx.x.x.x:9000 # ip:api端口
servlet:
multipart:
# 單個上傳文件的最大值是200mb
max-file-size: 200MB
# 單次請求的最大值
max-request-size: 200MB
4.4?編寫 MinIO屬性配置類
@Data
@Component
@ConfigurationProperties(prefix = "minio") //自動注入屬性前綴為minio的配置
public class MinIOConfigProperties implements Serializable {
private String accessKey; // 訪問key
private String secretKey; // 秘鑰
private String bucket; // 桶
private String endpoint; // 地域節(jié)點
private String readPath; // 讀取路徑
}
4.5?編寫MinIO配置類,注冊MinioClient客戶端Bean實例
@Configuration
public class MinIOConfig {
@Autowired
private MinIOConfigProperties minIOConfigProperties;
// 注冊MinIO實例
@Bean
public MinioClient buildMinioClient(){
return MinioClient
.builder()
.credentials(minIOConfigProperties.getAccessKey(), minIOConfigProperties.getSecretKey())
.endpoint(minIOConfigProperties.getEndpoint())
.build();
}
}
4.6?編寫操作minio相關業(yè)務接口
public interface FileStorageService {
/**
* 上傳圖片文件
*
* @param prefix 文件前綴
* @param filename 文件名
* @param inputStream 文件流
* @return 文件全路徑
*/
public String uploadImgFile(String prefix, String filename, InputStream inputStream);
/**
* 上傳html文件
*
* @param prefix 文件前綴
* @param filename 文件名
* @param inputStream 文件流
* @return 文件全路徑
*/
public String uploadHtmlFile(String prefix, String filename, InputStream inputStream);
/**
* 刪除文件
*
* @param pathUrl 文件全路徑
*/
public void delete(String pathUrl);
/**
* 下載文件
*
* @param pathUrl 文件全路徑
* @return
*/
public byte[] downLoadFile(String pathUrl);
}
業(yè)務接口實現(xiàn)類:
@Service
public class MinIOFileStorageService implements FileStorageService {
@Autowired
MinioClient minioClient;
@Autowired
MinIOConfigProperties minIOConfigProperties;
final static String separator = "/"; //文件夾分隔符
/**
* 構建文件的絕對路徑
*
* @param dirPath 文件路徑
* @param filename 文件名 yyyy/mm/dd/file.jpg
* @return /test
*/
public String builderFilePath(String dirPath, String filename) {
StringBuilder stringBuilder = new StringBuilder(50);
if (!StringUtils.isEmpty(dirPath)) {
stringBuilder.append(dirPath).append(separator);
}
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
String todayStr = sdf.format(new Date());
stringBuilder.append(todayStr).append(separator);
stringBuilder.append(filename);
return stringBuilder.toString();
}
/**
* 上傳圖片文件
*
* @param prefix 文件前綴
* @param filename 文件名
* @param inputStream 文件流
* @return 文件全路徑
*/
@Override
public String uploadImgFile(String prefix, String filename, InputStream inputStream) {
String filePath = builderFilePath(prefix, filename);
try {
PutObjectArgs putObjectArgs = PutObjectArgs.builder()
.object(filePath)
.contentType("image/jpg")
.bucket(minIOConfigProperties.getBucket()).stream(inputStream, inputStream.available(), -1)
.build();
minioClient.putObject(putObjectArgs);
StringBuilder urlPath = new StringBuilder(minIOConfigProperties.getReadPath());
urlPath.append(separator + minIOConfigProperties.getBucket());
urlPath.append(separator);
urlPath.append(filePath);
return urlPath.toString();
} catch (Exception ex) {
throw new RuntimeException("上傳文件失敗");
}
}
/**
* 上傳html文件
*
* @param prefix 文件前綴
* @param filename 文件名
* @param inputStream 文件流
* @return 文件全路徑
*/
@Override
public String uploadHtmlFile(String prefix, String filename, InputStream inputStream) {
String filePath = builderFilePath(prefix, filename);
try {
PutObjectArgs putObjectArgs = PutObjectArgs.builder()
.object(filePath) //文件名
.contentType("text/html")//文件類型
.bucket(minIOConfigProperties.getBucket())//桶名稱與minio創(chuàng)建的桶一致
.stream(inputStream, inputStream.available(), -1)//文件流
.build();
minioClient.putObject(putObjectArgs);
StringBuilder urlPath = new StringBuilder(minIOConfigProperties.getReadPath());
urlPath.append(separator + minIOConfigProperties.getBucket());
urlPath.append(separator);
urlPath.append(filePath);
return urlPath.toString(); //文件全路徑
} catch (Exception ex) {
ex.printStackTrace();
throw new RuntimeException("上傳文件失敗");
}
}
/**
* 刪除文件
*
* @param pathUrl 文件全路徑
*/
@Override
public void delete(String pathUrl) {
String key = pathUrl.replace(minIOConfigProperties.getEndpoint() + "/", "");
int index = key.indexOf(separator);
String bucket = key.substring(0, index);
String filePath = key.substring(index + 1);
// 刪除Objects
RemoveObjectArgs removeObjectArgs = RemoveObjectArgs.builder().bucket(bucket).object(filePath).build();
try {
minioClient.removeObject(removeObjectArgs);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 下載文件
*
* @param pathUrl 文件全路徑
* @return 文件流
*/
@Override
public byte[] downLoadFile(String pathUrl) {
String key = pathUrl.replace(minIOConfigProperties.getEndpoint() + "/", "");
int index = key.indexOf(separator);
String bucket = key.substring(0, index);
String filePath = key.substring(index + 1);
InputStream inputStream = null;
try {
inputStream = minioClient.getObject(GetObjectArgs.builder().bucket(minIOConfigProperties.getBucket()).object(filePath).build());
} catch (Exception e) {
e.printStackTrace();
}
//字節(jié)數(shù)組輸出流
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
byte[] buff = new byte[100];
int rc = 0;
while (true) {
try {
if (!((rc = inputStream.read(buff, 0, 100)) > 0)) break;
} catch (IOException e) {
e.printStackTrace();
}
byteArrayOutputStream.write(buff, 0, rc);
}
return byteArrayOutputStream.toByteArray();
}
}
4.7?編寫controller進行測試
@RestController
@RequestMapping("/minio")
public class MinioController {
@Autowired
private FileStorageService fileStorageService;
/**
* 上傳圖片到minio
*
* @param file
* @return
*/
@PostMapping("/upload")
public void uploadFile(MultipartFile file) throws IOException {
try {
// 獲取文件名稱
String fileName = file.getOriginalFilename();
/*解決多次上傳同名文件覆蓋問題*/
// 在文件名稱里面添加隨機唯一的值
String uuid = UUID.randomUUID().toString().replaceAll("-", "");
fileName = uuid + fileName;
// 獲取文件輸入流
InputStream is = file.getInputStream();
String imgUrl = fileStorageService.uploadImgFile("img", fileName, is);
return "上傳成功!imgUrl:"+imgUrl;
} catch (IOException e) {
e.printStackTrace();
return "上傳失敗";
}
}
}
4.8 啟動項目,測試
查看 Minio 可視化界面圖片是否上傳成功
文章來源:http://www.zghlxwxcb.cn/news/detail-805990.html
可通過ip+圖片路徑直接訪問。?文章來源地址http://www.zghlxwxcb.cn/news/detail-805990.html
到了這里,關于Minio安裝及整合SpringBoot的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!