Java使用Minio上傳檔案示例程式碼
1. Minio介紹
MinIO 是一個基於Apache License v3.0開源協議的物件儲存服務。它相容亞馬遜S3雲端儲存服務介面,非常適合於儲存大容量非結構化的資料,例如圖片、影片、日
志檔案、備份資料和容器/虛擬機器映象等,而一個物件檔案可以是任意大小,從幾kb到最大5T不等。
官網地址:https://docs.min.io/
MinIO特點
1、高效能:作為高效能物件儲存,在標準硬體條件下它能達到55GB/s的讀、35GB/s的寫速率
2、可擴容:不同MinIO叢集可以組成聯邦,並形成一個全域性的名稱空間,並跨越多個資料中心
3、雲原生:容器化、基於K8S的編排、多租戶支援
4、Amazon S3相容:Minio使用Amazon S3 v2 / v4 API。可以使用Minio SDK,Minio Client,AWS SDK和AWS CLI訪問Minio伺服器。
5、可對接後端儲存: 除了Minio自己的檔案系統,還支援DAS、 JBODs、NAS、Google雲端儲存和Azure Blob儲存。
6、SDK支援: 基於Minio輕量的特點,它得到類似Java、Python或Go等語言 的sdk支援
7、有操作頁面
8、功能簡單: 這一設計原則讓MinIO不容易出錯、更快啟動
9、支援糾刪碼:MinIO使用糾刪碼、Checksum來防止硬體錯誤和靜默資料汙染。在最高冗餘度配置下,即使丟失1/2的磁碟也能恢復資料!
MinIO儲存機制:
Minio使用糾刪碼erasure code和校驗和checksum。 即便丟失一半數量(N/2)的硬碟,仍然可以恢復資料。糾刪碼是一種恢復丟失和損壞資料的數學演算法。
2. 使用示例-上傳檔案
首先定義一個配置類用於讀取Minio中的相關配置, 並初始化一個MinioClient物件
@Configuration
//@ConfigurationProperties(prefix="minio") //讀取節點
@Data
public class MinioConstantProperties {
@Value("${minio.endpointUrl}")
private String endpointUrl;
@Value("${minio.accessKey}")
private String accessKey;
@Value("${minio.secreKey}")
private String secreKey;
@Value("${minio.bucketName}")
private String bucketName;
@Bean
public MinioClient minioClient(){
return MinioClient.builder()
.endpoint(endpointUrl)
.credentials(accessKey, secreKey)
.build();
}
}
自定義一個Controller用於接收前端上傳檔案的請求:
@Tag(name = "上傳管理介面")
@RestController
@RequestMapping("api/fileUpload")
public class FileUploadApiController {
@Autowired
private FileUploadService fileUploadService ;
@Operation(summary = "上傳檔案")
@PostMapping("fileUpload")
public Result<String> fileUpload(MultipartFile file) throws Exception {
String url = fileUploadService.fileUpload(file);
return Result.ok(url);
}
}
編寫相關的Service介面以及實現類,這裡只給出Service層的實現類:
@Service
public class FileUploadServiceImpl implements FileUploadService {
@Autowired
private MinioConstantProperties minioConstantProperties;
@Autowired
private MinioClient minioClient;
/**
*
* @description 檔案上傳
* @param file 需要上傳的檔案
* @return 檔案在minio伺服器中的地址
*
*/
@Override
public String fileUpload(MultipartFile file) {
try{
// 判斷桶是否存在
if (!minioClient.bucketExists(BucketExistsArgs.builder().bucket(minioConstantProperties.getBucketName()).build())) {
minioClient.makeBucket(MakeBucketArgs.builder().bucket(minioConstantProperties.getBucketName()).build());
}
// 生成檔名
String fileName = UUID.randomUUID().toString().replace("-","")+ "."+FilenameUtils.getExtension(file.getOriginalFilename());
// 上傳檔案到MinIO並返回檔案在MinIO伺服器中的地址
PutObjectArgs putObjectArgs = PutObjectArgs.builder()
.bucket(minioConstantProperties.getBucketName()) // 桶名
.object(fileName) // 儲存到MinIO的檔名
.stream(file.getInputStream(), file.getSize(), -1) // 檔案流
.contentType(file.getContentType()) // 檔案型別
.build();
minioClient.putObject(putObjectArgs);
return minioConstantProperties.getEndpointUrl()+"/"+minioConstantProperties.getBucketName()+"/"+fileName;
} catch (Exception e){
throw new RuntimeException(e);
}
}
}