关于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);
}
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了