Amazon S3 列出“目录”

新手上路,请多包涵

我通过 AWS S3 管理控制台在 S3 中创建了一个层次结构。如果我运行以下代码来列出存储桶:

 AmazonS3 s3 = new AmazonS3Client(CRED);
ListObjectsRequest lor = new ListObjectsRequest()
                             .withBucketName("myBucket")
                             .withPrefix("code/");
ObjectListing objectListing = s3.listObjects(lor);
for (S3ObjectSummary summary: objectListing.getObjectSummaries()) {
    System.out.println(summary.getKey());
}

我得到:

 code/
code/03000000-0001-0000-0000-000000000000/
code/03000000-0001-0000-0000-000000000000/special.js
code/03000000-0001-0000-0000-000000000000/test.js
code/03000000-0002-0000-0000-000000000000/

这正是我所期望的。如果我添加一个分隔符,那么我只直接在“代码/”下列出内容,我现在不会得到任何子“目录”。

将上面的行(在末尾添加 withDelimiter() )更改为:

 ListObjectsRequest lor = new ListObjectsRequest().withBucketName("myBucket")
                                                 .withPrefix("code/")
                                                 .withDelimiter("/");

而我现在只得到:

 code/

我知道 S3 没有“目录”,而是分隔键,但这种行为似乎很奇怪?我将如何列出仅在“代码”下方的内容?

原文由 Kong 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.3k
2 个回答

如果您拥有没有内容的键,S3 会将它们视为“通用前缀”:

http://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/model/ObjectListing.html#getCommonPrefixes%28%29

公共列表 getCommonPrefixes()

获取此对象列表中包含的公共前缀。只有在原始请求中指定了分隔符时,才会出现公共前缀。

每个公共前缀代表 S3 存储桶中的一组键,这些键已被压缩并从对象摘要结果中省略。这允许应用程序分层组织和浏览它们的密钥,类似于文件系统将文件组织到目录中的方式。

例如,考虑包含以下键的存储桶:

“富/酒吧/巴兹”

“富/酒吧/庆典”

“foo/bar/bang”

“嘘/嘘”

如果在此存储桶上使用前缀=“foo/” 和定界符=“/” 调用 listObjects,则返回的 S3ObjectListing 将包含公共前缀列表(“foo/bar/”)中的一个条目,并且不包含任何以该条目开头的键公共前缀将包含在对象摘要列表中。

返回:此对象列表中包含的公共前缀列表,如果未找到公共前缀,则该列表可能为空列表。

原文由 Kong 发布,翻译遵循 CC BY-SA 3.0 许可协议

This below code worked for me to list all directories in s3.

private static String bucket_name = "";
private static String secret_key = "";
private static String access_key = "";
private static String Regions region = Regions.SELECT_REGION;

public static void main(String[] args) {
        System.out.println(listKeysInBucket(bucket_name, "/"));
    }

    public static List<String> listKeysInBucket(String bucketName, String prefix) {
        boolean isTopLevel = false;
        String delimiter = "/";
        if (prefix.equals("") || prefix.equals(delimiter)) {
            isTopLevel = true;
        }
        if (!prefix.endsWith(delimiter)) {
            prefix += delimiter;
        }

        ListObjectsRequest listObjectsRequest = null;
        if (isTopLevel) {
            listObjectsRequest = new ListObjectsRequest().withBucketName(bucketName).withDelimiter(delimiter);
        } else {
            listObjectsRequest = new ListObjectsRequest().withBucketName(bucketName).withPrefix(prefix)
                    .withDelimiter(delimiter);
        }

        ObjectListing objects = s3Client().listObjects(listObjectsRequest);
        return objects.getCommonPrefixes();
    }

    public static AmazonS3 s3Client() {
        AWSCredentials s3Configs = new BasicAWSCredentials(access_key,secret_key);
        return AmazonS3ClientBuilder.standard()
                .withCredentials(new AWSStaticCredentialsProvider(s3Configs)).withRegion(region )
                .build();
    }

原文由 Sidhajyoti 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题