[英]Access selective folders in S3 bucket visa AWS Transfer User
[英]Listing just the sub folders in an s3 bucket
我有一个 s3 结构如下:
s3bucketname -> List of first level keys -> List of second level keys -> List of third level keys -> Actual file.
我需要做的是,给定 s3bucket 的名称和一级密钥的条目,我需要位于一级密钥下的所有二级密钥的名称。 所以基本上如果我们把它看成一个文件夹,我会得到root folder
的名称,即s3bucketname
和它的一个子文件夹subfolder1
的名称,我想列出 subfolder1 中的所有文件subfolder1
。 不过只是名字,不是完整的路径。
有人可以指出如何使用亚马逊的 java sdk 在 java 中做到这一点吗?
谢谢
我做了以下代码似乎工作正常,您必须传递prefix
并确保前缀以/结尾,并且还指定要获取子目录列表的分隔符。 以下应该有效:
public List<String> listKeysInDirectory(String bucketName, String prefix) {
String delimiter = "/";
if (!prefix.endsWith(delimiter)) {
prefix += delimiter;
}
ListObjectsRequest listObjectsRequest = new ListObjectsRequest()
.withBucketName(bucketName).withPrefix(prefix)
.withDelimiter(delimiter);
ObjectListing objects = _client.listObjects(listObjectsRequest);
return objects.getCommonPrefixes();
}
查尔斯版超级简洁! 谢谢@ charles-menguy
我写了一个扩展,通过分页支持巨大的列表。
public List<String> getSubPathsInS3Prefix(String bucketName, String prefix) {
if (!prefix.endsWith(FILE_DELIMITER)) {
prefix += FILE_DELIMITER;
}
List<String> paths = new ArrayList<String>();
ListObjectsRequest listObjectsRequest = new ListObjectsRequest()
.withBucketName(bucketName).withPrefix(prefix)
.withMaxKeys(1000).withDelimiter(FILE_DELIMITER);
ObjectListing currentListing = s3Client.listObjects(listObjectsRequest);
paths.addAll(currentListing.getCommonPrefixes());
while (currentListing == null || currentListing.isTruncated()) {
currentListing = s3Client.listNextBatchOfObjects(currentListing);
paths.addAll(currentListing.getCommonPrefixes());
}
return paths;
}
http://www.lazywiz.com/uncategorized/s3-missing-api-list-sub-paths-in-the-s3-bucket/
重要的是 S3 中没有真正的文件夹概念。 但是让我们看看 S3 API 可以使用哪些技巧。
在此示例中,列出了名为“lala”的特定“文件夹”下的所有“子文件夹”(键)(没有该子文件夹的递归结构)。
Prefix="lala/" 和 Delimiter="/" 参数发挥了作用。
此外,此解决方案使用 S3 分页器 API。即使结果包含超过 1000 个对象,该解决方案也会收集所有结果。 S3 分页器 API 自动解析下一个结果从 1001 到 2000 等等。
# given "folder/key" structure
# .
# ├── lorem.txt
# ├─── lala
# │ ├── folder1
# │ │ ├── file1.txt
# │ │ └── file2.txt
# │ ├── folder2
# │ │ └── file1.txt
# │ └── folder3
# │ └── file1.txt
# └── lorem
# └── folder4
# ├── file1.txt
# └── file2.txt
import boto3
s3 = boto3.client('s3')
paginator = s3.get_paginator('list_objects_v2')
# Execute paginated list_objects_v2
response = paginator.paginate(Bucket="your-bucket-name", Prefix="lala/", Delimiter="/")
# Get prefix for each page result
names = []
for page in response:
names.extend([x["Prefix"] for x in page.get("CommonPrefixes", [])])
print(names)
# Result is:
# ['lala/folder1/','lala/folder2/','lala/folder3/']
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.