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