如何在S3存储桶中只获取一个级别的对象?

时间:2011-03-28 06:13:41

标签: amazon-s3

我想仅列出存储桶中不是存储桶的对象。有没有办法解析ListBucket的结果?

3 个答案:

答案 0 :(得分:16)

  

存储桶中不是存储桶的对象

铲斗不能包含其他铲斗。你的意思是文件夹? S3也没有文件夹的概念。

每个S3帐户可以有100个存储桶,每个存储桶可以包含无限数量的对象/文件。如果您在文件名中使用/命名文件,则AWS GUI工具(例如AWS Console,BucketExplorer等)会将每个部分解释为虚拟文件夹。例如

名为folder1/folder2/myfile.jpg的文件将作为具有该名称的“平面”文件存储在S3中,但在GUI工具中,它看起来好像名为myfile.jpg的文件在folder1/folder2中是2个子文件夹{1}}。

您可以使用prefixdelimiter参数来解析GET Bucket (List Objects)来电的结果。任何SDK中都提供相同的选项。

更新以回复评论。

假设我们的S3存储桶看起来像这样:

mybucket
   folder1
      file1.txt
      file2.txt
      folder2
          file3.txt
          file4.txt
      folder3
          file5.txt
          file6.txt

使用 prefix = "folder1/" 会返回所有6个文件:file1.txtfile6.txt

使用 prefix = "folder1/" delimiter = "/" 会返回2个文件:

    file1.txt
    file2.txt

包含

的响应的CommonPrefixes集合
    folder1/folder2/
    folder1/folder3/

答案 1 :(得分:0)

使用最新的boto3版本(截至目前为1.14)和list_objects_v2方法是一种更好的方法。

import boto3

s3_client = boto3.client('s3')
response = s3_client.list_objects_v2(Bucket=bucket_name, Prefix=your_prefix)

print(response)

答案 2 :(得分:0)

我一直在寻找解决相同的问题“ 仅列出第一/根/ x级目录”,最后偶然发现了一个名为“ Paginator”的东西。

$results = $s3Client->getPaginator('ListObjects', [
    'Bucket'    => 'my-bucket',
    'Delimiter' => '/'
]);

$expression = '[CommonPrefixes[].Prefix, Contents[].Key][]';
foreach ($results->search($expression) as $item) {
    echo $item . "\n";
}

我对其进行了测试,并且工作完全符合预期! :)

https://docs.aws.amazon.com/sdk-for-php/v3/developer-guide/guide_paginators.html