【问题标题】:Listing just the sub folders in an s3 bucket仅列出 s3 存储桶中的子文件夹
【发布时间】:2013-01-17 04:50:47
【问题描述】:

我的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。只是名称,而不是完整的路径。

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

谢谢

【问题讨论】:

标签: java amazon-web-services amazon-s3


【解决方案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();
}

【讨论】:

  • 好的,我正在尝试这样做,但我收到了拒绝访问的错误。 @Charles Menguy 你对 S3 访问配置有任何线索吗?
  • 前缀 - 为什么这是必需的。我想列出我的存储桶本身中的所有项目,然后检查子目录。所以为此我还需要添加前缀吗?
  • 对于未来的读者 - 如果您想在存储桶本身下列出“文件夹”,则无需使用“withPrefix”
【解决方案2】:

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

【讨论】:

  • 你能解释一下这里的前缀应该是什么
猜你喜欢
  • 2018-04-19
  • 1970-01-01
  • 1970-01-01
  • 2021-07-03
  • 2020-01-24
  • 2016-10-29
  • 1970-01-01
  • 1970-01-01
  • 2020-04-01
相关资源
最近更新 更多