MinIO
约 672 字大约 2 分钟
MinIO
在使用时,用的是 MinioClient 对象
MinIO 是一个高性能的对象存储系统,设计初衷是作为云原生存储系统的替代方案
对象存储的概念与标准 Unix 文件系统类似,但 它使用的是"桶(bucket)"和"对象(object)"的概念,而不是目录和文件
桶可以像目录一样嵌套形成层级结构,而对象则是一组任意的字节数据,可以是图片、PDF 或其他任何文件类型
与文件系统类似,桶和对象也可以设置权限,实现细粒度的访问控制
在安装好 MinIO 后,可以去基于 Web 的管理控制台访问管理
MinIO JAVA SDK
不过在 JAVA 中更多的是通过 Java SDK 使用 MinIO
首先在项目中添加依赖:
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>8.5.2</version>
</dependency>
之后,通过 Spring 的 @Value 以及 @Bean等注释,来自动注册一个 MinIOClient 的实例,用于之后的操作
主要配置文件在 MinioConfig
@Configuration
public class MinioConfig {
@Value("${minio.endpoint}")
private String endpoint;
@Value("${minio.accessKey}")
private String accessKey;
@Value("${minio.secretKey}")
private String secretKey;
@Value("${minio.publicUrl}")
private String publicUrl;
@Bean
public MinioClient minioClient() {
return MinioClient.builder()
// 端口,存储地址
.endpoint(endpoint)
// 公钥和秘钥
.credentials(accessKey, secretKey)
.build();
}
@Bean
public String minioPublicUrl() {
return publicUrl;
}
}
主要API
桶操作
bucketExists(BucketExistsArgs): 检查某个桶是否存在。makeBucket(MakeBucketArgs): 创建新桶。listBuckets(): 列出当前账号下所有的桶。removeBucket(RemoveBucketArgs): 删除空桶。
注意:在上传文件前,通常会先调用 bucketExists 检查,不存在则调用 makeBucket 创建
对象操作
这是最频繁使用的部分,用于处理实际的文件
- 上传
putObject(PutObjectArgs): 最通用的上传接口,支持从 InputStream 上传uploadObject(UploadObjectArgs): 直接从本地磁盘文件路径上传,效率更高
- 下载与查看
getObject(GetObjectArgs): 获取文件的输入流(InputStream),用于后端处理文件内容。statObject(StatObjectArgs): 获取元数据(文件大小、最后修改时间、Content-Type 等),但不下载文件本身。
- 列表与删除
listObjects(ListObjectsArgs): 遍历桶内的文件removeObject(RemoveObjectArgs): 删除单个对象removeObjects(RemoveObjectsArgs): 批量删除
预签名操作
是 MinIO 非常强大的一类 API,主要解决 “权限安全” 问题。
getPresignedObjectUrl(GetPresignedObjectUrlArgs): 生成一个带有时效性的 HTTP GET 链接场景: 你的文件是私有的,但你想让用户在接下来的 10 分钟内可以点击查看一张图片
简单示例
// 构建上传参数
minioClient.putObject(
PutObjectArgs.builder()
.bucket("my-bucket")
.object("test.jpg")
.stream(inputStream, size, -1) // -1 表示不限制分片大小
.contentType("image/jpeg") // 设置文件类型,方便浏览器直接预览
.build()
);
