【MinIO】MinIO搭建自己的对象存储服务器
最近项目上有需要用到文件存储的功能,综合考量之后决定采用MinIO来存储,于是这篇文章就简单记录一下MinIO服务端的搭建和客户端的基本使用
官方安装包:https://dl.minio.org.cn/server/minio/release/[操作系统平台]/minio,以mac为例

1、MinIO服务端搭建【单节点单磁盘部署】
由于这里记录的是在开发环境的搭建,所以这里不考虑高可用高性能这类需求,只要求满足功能性要求即可,所以这里采用docker的方式部署单节点单磁盘,集群模式参考官方文档说明,也很简单
docker run -d \
-p 9000:9000 \
-p 9001:9001 \
--name minio \
-e "MINIO_ROOT_USER=changeme" \
-e "MINIO_ROOT_PASSWORD=changeme" \
-v /opt/minio/data:/data \
minio:latest server /data --console-address ":9001"
端口9000主要提供给各个客户端使用,而9001主要是给web控制台使用
数据目录挂载在了本地
/opt/minio/data目录下设置了账号
MINIO_ROOT_USER和密码MINIO_ROOT_PASSWORD,对应的值自行修改这里拉不下来官方镜像的话可以拉我的阿里云镜像:registry.cn-hangzhou.aliyuncs.com/xhsx/minio:latest
容器启动成功之后就可以通过浏览器http://IP+9000或者http://IP+9001访问,账号和密码就是上面自己设置的值

可以自己在页面控制台手动创建bucket或者上传文件到指定的bucket,或者在console控制台通过命令行操作也行

2、Java客户端的使用
服务端搭建完成之后,如何通过Java去操作文档呢?
官方提供了一个Java快速开发指南:https://minio.org.cn/docs/minio/linux/developers/java/minio-java.html#minio-java-quickstart
2.1、文件上传
文档里这里详细描述了怎么用Java客户端去操作MinIO,并提供了一个demo
Maven依赖:
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>8.5.13</version>
</dependency>
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>4.12.0</version>
</dependency>
java代码
import io.minio.BucketExistsArgs;
import io.minio.MakeBucketArgs;
import io.minio.MinioClient;
import io.minio.UploadObjectArgs;
import io.minio.errors.MinioException;
import org.springframework.util.StopWatch;
import java.util.Objects;
public class FileUploader {
public static void main(String[] args) throws Exception {
MinioClient minioClient = null;
StopWatch stopWatch = new StopWatch();
try {
// Create a minioClient with the MinIO server playground, its access key and secret key.
minioClient =
MinioClient.builder()
.endpoint("http://10.0.2.197:9000/")
.credentials("fZKRjP2RDTm23kf5MsBa", "NuRQjfadNlwamCtGqBas2nG90JMUVuFjoW1pzMFF")
.build();
// Make 'asiatrip' bucket if not exist.
boolean found = minioClient.bucketExists(BucketExistsArgs.builder().bucket("liuyuankun").build());
if (!found) {
// Make a new bucket called 'asiatrip'.
minioClient.makeBucket(MakeBucketArgs.builder().bucket("liuyuankun").build());
} else {
System.out.println("Bucket 'liuyuankun' already exists.");
}
// Upload '/home/user/Photos/asiaphotos.zip' as object name 'asiaphotos-2015.zip' to bucket
// 'asiatrip'.
stopWatch.start("开始上传");
minioClient.uploadObject(
UploadObjectArgs.builder()
.bucket("liuyuankun")
.object("instantclient-basic-linux.x64-12.1.0.2.0.zip")
.filename("/Users/navy/Downloads/instantclient-basic-linux.x64-12.1.0.2.0.zip")
.build());
System.out.println("'/Users/navy/Downloads/instantclient-basic-linux.x64-12.1.0.2.0.zip' is successfully uploaded as "
+ "object 'instantclient-basic-linux.x64-12.1.0.2.0.zip' to bucket 'liuyuankun'.");
stopWatch.stop();
} catch (MinioException e) {
System.out.println("Error occurred: " + e);
System.out.println("HTTP trace: " + e.httpTrace());
} finally {
if (Objects.nonNull(minioClient)) {
minioClient.close();
}
}
System.out.println(stopWatch.prettyPrint());
}
}
注意:
①、这里连接MinIO服务端的端口是9000
②、客户端连接还需要一个credentials值,AccessKey和SecretKey需要在服务端先创建,具体位置在下图所示的地方:

根据提示描述,这里的SecretKey只在创建成功的时候显示一次,防止忘记,可以将文件Download下来保存
运行上面的示例代码,就可以将文件上传到MinIO服务端了

2.2、文件预览
要实现文件预览,需要首先调用getPresignedObjectUrl api获取一个预览地址
public static void testGetPreviewUrl() throws Exception {
MinioClient minioClient = getMinioClient();
try {
GetPresignedObjectUrlArgs args = GetPresignedObjectUrlArgs.builder()
.bucket("liuyuankun")
.object("1.png")
.method(Method.GET)
.build();
String presignedObjectUrl = minioClient.getPresignedObjectUrl(args);
System.out.println(presignedObjectUrl);
} finally {
minioClient.close();
}
}
这个地址也太长了吧,而且默认的只有7天的有效期

这时候如果我们要长期访问,并且对文件没有特殊的安全性要求,则可以将bucket设置为Public,然后整个bucket下的文件就都可以通过域名+bucket+文件名方式访问了。

比如我的服务器地址是10.0.2.197,bucket名称为liuyuankun,文件名为1.png,则可以通过下面地址访问:
http://10.0.2.197:9000/liuyuankun/1.png
注意这里用的是9000端口,如果用9001端口的话默认会直接进入web控制台而不是直接预览文件
当然如果不想要全部放开bucket里的内容,也可以设置bucket的访问策略达到同样的目的,可以通过文件前缀配合访问权限设置


2.3、文件下载
文件下载也非常简单,直接调用downloadObject api即可
DownloadObjectArgs a = DownloadObjectArgs.builder()
.bucket("liuyuankun")
.object("1.png")
.filename("/Users/navy/Downloads/abba.png") //保存文件到哪儿
.build();
minioClient.downloadObject(a);

浙公网安备 33010602011771号