我想仅列出存储桶中不是存储桶的对象。有没有办法解析ListBucket的结果?
答案 0 :(得分:16)
存储桶中不是存储桶的对象
铲斗不能包含其他铲斗。你的意思是文件夹? S3也没有文件夹的概念。
每个S3帐户可以有100个存储桶,每个存储桶可以包含无限数量的对象/文件。如果您在文件名中使用/
命名文件,则AWS GUI工具(例如AWS Console,BucketExplorer等)会将每个部分解释为虚拟文件夹。例如
名为folder1/folder2/myfile.jpg
的文件将作为具有该名称的“平面”文件存储在S3中,但在GUI工具中,它看起来好像名为myfile.jpg
的文件在folder1/folder2
中是2个子文件夹{1}}。
您可以使用prefix
和delimiter
参数来解析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.txt
到file6.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