在使用minio时,由于minio的版本不同,低版本存在list对象获取存储桶全部对象时会无法显现文件夹或文件夹不会穿透问题。
这是我的minio SDK版本:
<!-- minio对象存储SDK-->
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>7.1.4</version>
</dependency>
通过上图的工具和桶文件,当我们listObjects时,如果我们用listObjects("testguo111")获取文件时,虽然可以获取全部文件,但是文件夹无法取到。
如果你的项目不考虑层级结构,那么上述的方法已经满足你的需求了;若是考虑层级,那么你就必须得获取到文件夹,不然无法进行关于文件夹的一切操作。
话不多说,直接上代码:
通过箭头处改写,我们就能得到文件夹了,但是此方法不会穿透文件夹获取底层文件信息;我们可以通过while循环即可获取全部文件,上代码:
此处我通过递归将文件保存到list集合中,由此即可得到桶内全部文件和文件夹;当我们校验文件夹是否存在等文件夹操作时,就能派上用场了。
最后附上本次示例的最终代码:
//测试效果
try {
List<Result<Item>> list = new ArrayList<Result<Item>>();
Iterable<Result<Item>> list2 = mm.listObjects(ListObjectsArgs.builder()
.bucket("testguo111").build());
for (Result<Item> result : list2) {
//此处需中文解码
String objectName = URLDecoder.decode(result.get().objectName(), "utf-8");
if (objectName.substring(objectName.length() -1).equals("/")) {
//最后一位是/则为文件夹
list.add(result);
totalFile(mm, "testguo111", objectName, list);
}else {
list.add(result);
}
for (Result<Item> result2 : list) {
String objectName2 = URLDecoder.decode(result2.get().objectName(), "utf-8");
System.out.println(objectName2);
}
}
} catch (Exception e) {
// TODO: handle exception
}
//递归取得全部文件
public static void totalFile(MinioClient minioClient, String bucketName, String folder, List<Result<Item>> list) {
try {
Iterable<Result<Item>> listObjects = minioClient.listObjects(ListObjectsArgs.builder()
.bucket(bucketName).prefix(folder).build());
for (Result<Item> result : listObjects) {
String objectName = URLDecoder.decode(result.get().objectName(), "utf-8");
if (objectName.substring(objectName.length() -1).equals("/")) {
//最后一位是/则为文件夹
list.add(result);
totalFile(minioClient, bucketName, objectName, list);
}else {
list.add(result);
}
}
} catch (Exception e) {
}
}