S3 ListObjectsV2 api 调用未返回内容

S3 ListObjectsV2 api call not returning contents

根据 ListObjectsV2 - Amazon Simple Storage Service 文档,当我指定一个 Prefix 和一个 Delimiter 时,我应该在响应中得到一个内容元素,前缀是一个 ETag。

<Contents>
    <Key>photos/2006/</Key>
    <LastModified>2016-04-30T23:51:29.000Z</LastModified>
    <ETag>"d41d8cd98f00b204e9800998ecf8427e"</ETag>
    <Size>0</Size>
    <StorageClass>STANDARD</StorageClass>
</Contents>

我已经尝试 运行 使用 python sdk (boto3)。

client.list_objects_v2(Bucket='bucketname', Prefix = "folder1-folder2-", Delimiter = "-")

但是在响应指令中,我没有找到内容键。根据示例中的响应,所有其他字段都存在。

dict_keys(['ResponseMetadata', 'IsTruncated', 'Name', 'Prefix', 'Delimiter', 'MaxKeys', 'CommonPrefixes', 'EncodingType', 'KeyCount'])

这是否不再包含在 API 调用的响应中。或者这是 SDK 确实显示的内容。 还有一个后续问题,如果它是 sdk 方面的东西,我如何在这个字段中 api 调用 returns 我。

当提供 PrefixDelimiter 时,Prefix 中的目录在 CommonPrefixes 中 return。

因此,如果有一个名为 folder1-folder2-folder3-file.txt 的对象,那么您的 return 响应应该包含一个 CommonPrefixes 列表,其中包括 folder3-.

由于您使用的是 boto3,因此查看 list_objects_v2() 的 boto3 文档会更容易。它显示了如何在响应中提供字段。

您可以像这样访问值:

response = s3_client.list_objects_v2(Bucket='bucketname', Prefix = "folder1-folder2-", Delimiter = "-")

# Objects
for object in response['Contents']:
  print(object['Key'])

# Folders
for folder in response['CommonPrefixes']:
  print(folder['Prefix'])

当用户在 Amazon S3 管理控制台中单击 创建文件夹 时,它会创建一个与 'folder' 同名的 zero-length 对象。这是因为 Amazon S3 实际上并不使用文件夹,但它可以通过 DelimiterCommonPrefixes 来模拟它们。通过创建 zero-length 对象,它会强制该文件夹名称显示为 CommonPrefix。它还会导致 zero-length 对象本身在 list_objects() API 调用中显示为一个对象。