之前已经介绍过如何在 Linux
与 Windows
平台上构建服务,今天就介绍一下 Java
如何调用 MinIO
相关 API
进行开发。
一、工程创建
1. 依赖导入
MinIO
要求 okhttp
的版本大于 4.8.1
,但其自带的默认为 3.14.8
,因为需要将原本的okhttp
依赖排除,手动添加高于 4.8.1
的版本。
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>8.3.5</version>
<!-- 排除原有 okhttp 依赖 -->
<exclusions>
<exclusion>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- 重新导入 okhttp 依赖 -->
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>4.9.2</version>
</dependency>
2. 初始对象
public void init() throws Exception {
minioClient = MinioClient.builder()
// 填入 minio API
.endpoint("http://xxx:9000")
// 填入用户名、密码
.credentials("username", "password")
.build();
}
二、桶操作
1. bucketExists()
用于判断对应存储桶是否已存在,通常在存入文件之前进行判断,如果不存在,应进行提示或者创建对应的存储桶。
public void ExistMinioBucket() throws Exception {
boolean found = minioClient.bucketExists(
BucketExistsArgs.builder()
.bucket("bucket")
.build());
if (found) {
System.out.println("bucket 已存在");
} else {
System.out.println("bucket 不存在");
}
}
2. makeBucket()
新建存储桶,存储桶名不能重复且命名必须遵守 Amazon S3
标准(不能含有下划线等特殊字符,不能包含大写字符)。
public void CreateMinioBucket() throws Exception {
minioClient.makeBucket(MakeBucketArgs.builder()
.bucket("newbucket")
.build());
}
3. removeBucket()
只能删除空的存储桶,非空存储桶想要删除必须先清空桶内文件。
public void DeleteMinioBucket() throws Exception {
minioClient.removeBucket(RemoveBucketArgs.builder()
.bucket("bucket")
.build());
}
三、文件操作
1. getObject()
从指定存储桶获取文件。
public void GetMinioFile() throws Exception {
try (InputStream is = minioClient.getObject(
GetObjectArgs.builder()
.bucket("bucket")
.object("1.csv")
.build())) {
int ch;
while ((ch = is.read()) != -1) {
// 控制台打印内容
System.out.write(ch);
}
}catch (XmlParserException | ServerException | NoSuchAlgorithmException
| InsufficientDataException | InvalidKeyException | IOException e) {
// 生产环境中应针对异常进行分类处理,这里demo测试就简单抛出。
throw new PrinterException();
} catch (InvalidResponseException | ErrorResponseException | InternalException e) {
throw new PrinterException();
}
}
2. putObject()
MinIO
以完整文件名为唯一标识,如果文件名重复,则会直接覆盖,建议在原有文件名之前拼接一个 UUID
或者时间戳。
public void PutMinioFile() throws Exception {
StringBuilder builder = new StringBuilder();
// 文件名拼接时间戳前缀
builder.append(UUID.randomUUID());
builder.append("_1.csv");
// 读取本地文件
File file = new File("./resources/Files/test.csv");
if (file.isFile()) {
FileInputStream fis = new FileInputStream(file);
try {
minioClient.putObject(PutObjectArgs.builder()
.bucket("bucket")
.object(builder.toString())
.stream(fis, fis.available(), -1)
.build());
} catch (IOException e) {
e.printStackTrace();
}
} else {
System.out.println("文件不存在!");
}
}
3. listObjects()
(Ⅰ) 列出桶内所有文件相关信息
public void ListEntireMinio() throws Exception {
Iterable<Result<Item>> results = minioClient.listObjects(
ListObjectsArgs.builder()
.bucket("bucket")
.build());
StringBuilder builder = new StringBuilder();
for (Result<Item> result : results) {
// 对查询结果进行简单拼接
builder.append(result.get().objectName());
builder.append(", ");
builder.append(result.get().lastModified());
builder.append(", ");
builder.append(result.get().size());
builder.append("\n");
}
System.out.println(builder);
}
(Ⅱ) 列出桶内某个时间点后的文件相关信息
public void ListPartMinio() throws Exception {
Iterable<Result<Item>> results = minioClient.listObjects(
ListObjectsArgs.builder()
.bucket("bucket")
.build());
StringBuilder builder = new StringBuilder();
// 设置时间点
Timestamp earliest = Timestamp.valueOf("1970-01-01 00:00:001");
for (Result<Item> result : results) {
Timestamp timestamp = Timestamp.from(result.get().lastModified().toInstant());
// 如果文件最新更新时间在上述指定的时间之后进行打印
if(timestamp.after(earliest)){
// 打印:文件名,最后创建时间,文件大小
builder.append(result.get().objectName());
builder.append(", ");
builder.append(timestamp);
builder.append(", ");
builder.append(result.get().size());
builder.append("\n");
}
}
System.out.println(builder);
}
(Ⅲ) 指定从某一个字符之后开始列出文件信息
例如newbucket
桶内存有三个文件:a.csv, b.csv, c.csv
,而startAfter("b")
最终只会输出:b.csv, c.csv
。
public void ListAlphabetMinio() throws Exception {
Iterable<Result<Item>> results = minioClient.listObjects(
ListObjectsArgs.builder()
.bucket("bucket")
.startAfter("b")
.build());
StringBuilder builder = new StringBuilder();
for (Result<Item> result : results) {
// 打印文件名,最后创建时间,文件大小
builder.append(result.get().objectName());
builder.append(", ");
builder.append(result.get().lastModified());
builder.append(", ");
builder.append(result.get().size());
builder.append("\n");
}
System.out.println(builder);
}
4. removeObject()
从指定存储桶内删除文件。
public void DeleteMinioFile() throws Exception {
minioClient.removeObject(RemoveObjectArgs.builder()
.bucket("newbucket")
.object("1.csv")
.build());
}
5. getPresignedObjectUrl()
用于生成文件外链,可以根据需求自定义外链访问请求方式。
public void MinioUrl() throws Exception{
String bucketName = "webtest";
String objectName = "1.jpg";
Integer expires = 7;
String url = minioClient.getPresignedObjectUrl(
GetPresignedObjectUrlArgs.builder()
.method(Method.GET)
.bucket(bucketName)
.object(objectName)
.expiry(expires, TimeUnit.DAYS)
.build());
System.out.println(url);
}
源码:Minio API案例