微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

php – 如何从Amazon S3 ListObjects Iterator获取CommonPrefixes

我正在尝试将存储桶中的对象列表放入有组织的列表中,包含文件夹和文件.

在文档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 举报,一经查实,本站将立刻删除。

相关推荐