關於Java使用MinIO檔案伺服器操作檔案

LilyFlower發表於2024-09-17

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);
        }
    }
}

3. 使用示例-刪除檔案

相關文章