仅列出 s3 存储桶中的子文件夹

2022-09-02 19:12:35

我有一个s3结构,如下所示:

s3bucketname -> List of first level keys -> List of second level keys -> List of third level keys -> Actual file.

我需要做的是,给定 s3bucket 的名称和第一级键的条目,我需要驻留在第一级键下的所有第二级键的名称。因此,从本质上讲,如果我们将其视为文件夹,则会为它指定其名称,并且其子文件夹之一的名称,我想列出驻留在其中的所有文件夹。只是名称,而不是完整的路径。root folders3bucketnamesubfolder1subfolder1

有人可以指出如何使用亚马逊的java sdk在java中做到这一点吗?

谢谢


答案 1

我做了以下代码,它似乎工作正常,你必须传递一个并确保前缀以/结尾,并指定你想要获取子目录列表的分隔符。以下方法应该有效: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();
}

答案 2

查尔斯版超级简洁!谢谢@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/


推荐