关于Java使用MinIO文件服务器操作文件

Lily Flower / 2024-09-18 / 原文

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. 使用示例-删除文件