S3 ListObjectsV2 api 调用不返回内容

Sur*_*eja 1 amazon-s3 amazon-web-services boto3

根据ListObjectsV2 - Amazon Simple Storage Service文档,当我指定 aPrefix和 a时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>
Run Code Online (Sandbox Code Playgroud)

我尝试使用 python sdk (boto3) 来运行它。

client.list_objects_v2(Bucket='bucketname', Prefix = "folder1-folder2-", Delimiter = "-")
Run Code Online (Sandbox Code Playgroud)

但在响应字典中,我找不到内容键。示例中响应的所有其他字段均存在。

dict_keys(['ResponseMetadata', 'IsTruncated', 'Name', 'Prefix', 'Delimiter', 'MaxKeys', 'CommonPrefixes', 'EncodingType', 'KeyCount'])
Run Code Online (Sandbox Code Playgroud)

这是 API 调用的响应中不再存在的内容吗?或者这是 SDK 没有显示的内容。还有一个后续问题,如果是 sdk 方面的问题,我如何进行 api 调用来返回该字段。

Joh*_*ein 5

当提供 aPrefix和 a时Delimiter,其中的目录Prefix将在 中返回CommonPrefixes

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

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

您可以像这样访问值:

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'])
Run Code Online (Sandbox Code Playgroud)

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