我正在尝试将存储桶中的对象列表放入有组织的列表中,包含文件夹和文件.
在文档S3 Listing Keys Hierarchically Using Prefix and Delimiter中,Amazon声明当前所选目录中还有其他目录时:
Amazon S3 groups these keys and return a single CommonPrefixes element
$iterator = $client->getIterator(
'ListObjects',
array(
'Bucket' => $bucket,
'Prefix' => $dir,
'Delimiter' => '/'
)
);
哪个做得好.它获取存储桶中的所有对象(与低级别ListObjects方法不同,后者返回最多1000个对象)并按字母顺序显示它们.
如果我告诉这个迭代器返回一个这样的数组:
$objects = $iterator->toArray();
然后我可以在foreach循环中使用这个数组
foreach ($objects as $object) {
echo $object['Key'] . "<br/>\n";
}
这给了我所有文件的指针:
> folder /子文件夹/ file.ext
> folder / subfolder / file2.ext
> folder /子文件夹/ file3.ext
> folder /子文件夹/ file4.ext
> folder / subfolder / file5.ext
但它没有显示此目录中的其他目录.
调用$iterator-> get(‘CommonPrefixes’)返回null. $iterator变量上的任何其他操作都会导致代码崩溃.
如何在ListBucketResult中访问完整的响应集?
解决方法:
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.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。