我正在尝试将存储桶中的对象列表放入有组织的列表中,包含文件夹和文件。
在文档S3 Listing Keys Hierarchically Using Prefix and Delimiter中,Amazon声明当前所选目录中还有其他目录时:
Amazon S3对这些键进行分组并返回单个CommonPrefixes元素
我有以下代码:
$iterator = $client->getIterator(
'ListObjects',
array(
'Bucket' => $bucket,
'Prefix' => $dir,
'Delimiter' => '/'
)
);
做得很好。它获取存储桶中的所有对象(与低级ListObjects
方法不同,后者最多返回1000个对象)并按字母顺序显示它们。
如果我告诉这个迭代器像这样返回array
:
$objects = $iterator->toArray();
然后,我可以在array
循环中使用此foreach
foreach ($objects as $object) {
echo $object['Key'] . "<br/>\n";
}
它给了我所有指向文件的指针:
虽然没有显示此目录中的其他目录。
调用$iterator->get('CommonPrefixes')
会返回null
。 $iterator
变量上的任何其他操作都会导致代码崩溃。
如何在ListBucketResult
?
答案 0 :(得分:6)
getIterator()
方法具有第三个参数,用于特定于迭代器对象的选项。 S3 ListObjects迭代器实际上是一个具体类,并在其文档中指定了一些自定义选项:return_prefixes
,sort_results
和names_only
(请参阅http://docs.aws.amazon.com/aws-sdk-php/latest/class-Aws.S3.Iterator.ListObjectsIterator.html)。使用return_prefixes
将CommonPrefixes
与对象混合在一起。试试这个:
$iterator = $client->getIterator(
'ListObjects',
array(
'Bucket' => $bucket,
'Prefix' => $dir,
'Delimiter' => '/'
),
array(
'return_prefixes' => true,
),
);
foreach ($iterator as $object) {
if (isset($object['Prefix'])) {
// For Common Prefixes
echo $object['Prefix'] . "<br/>\n";
} else {
// For Objects
echo $object['Key'] . "<br/>\n";
}
}
// Also Licensed under version 2.0 of the Apache License.