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

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 API 协议。Amazon S3 API 是一套基于 HTTP/HTTPS 的 RESTful 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. 使用示例-删除文件

posted @   LilyFlower  阅读(416)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示