sc_*_*ray 11 java amazon-s3 amazon-web-services
我有一个s3结构如下:
s3bucketname -> List of first level keys -> List of second level keys -> List of third level keys -> Actual file.
Run Code Online (Sandbox Code Playgroud)
我需要做的是,给定s3bucket的名称和第一级密钥的条目,我需要位于第一级密钥下的所有二级密钥的名称.所以基本上如果我们把它看作文件夹,我会得到它的名称和root folder它s3bucketname的一个子文件夹的名称subfolder1,我想列出其中的所有文件夹subfolder1.只是名字,而不是完整的路径.
有人可以指出如何使用亚马逊的java sdk在java中做到这一点吗?
谢谢
Cha*_*guy 36
我做了以下代码似乎工作正常,您必须传递一个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();
}
Run Code Online (Sandbox Code Playgroud)
查尔斯版超级简洁!谢谢@ 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;
}
Run Code Online (Sandbox Code Playgroud)
http://www.lazywiz.com/uncategorized/s3-missing-api-list-sub-paths-in-the-s3-bucket/