如何从Amazon S3 ListObjects迭代器获取CommonPrefixes

xad*_*ict 3 php sdk amazon-s3 amazon-web-services phar

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

在文档中,S3列表键分层使用前缀和分隔符,Amazon声明当前选定目录中有其他目录时:

Amazon S3对这些键进行分组并返回单个CommonPrefixes元素

我有以下代码:

$iterator = $client->getIterator(
    'ListObjects',
    array(
        'Bucket' => $bucket,
        'Prefix' => $dir,
        'Delimiter' => '/'
    )
);
Run Code Online (Sandbox Code Playgroud)

哪个做得好.它获取存储桶中的所有对象(与低级ListObjects方法不同,它返回最多1000个对象)并按字母顺序显示它们.

如果我告诉这个迭代器返回array如此:

$objects = $iterator->toArray();
Run Code Online (Sandbox Code Playgroud)

然后我可以arrayforeach循环中使用它

foreach ($objects as $object) {
  echo $object['Key'] . "<br/>\n";
}
Run Code Online (Sandbox Code Playgroud)

这给了我所有文件的指针:

  • 文件夹/子文件夹/ file.ext
  • 文件夹/子文件夹/ file2.ext
  • 文件夹/子文件夹/ file3.ext
  • 文件夹/子文件夹/ file4.ext
  • 文件夹/子文件夹/ file5.ext

但它没有显示此目录中的其他目录.

致电$iterator->get('CommonPrefixes')回报null.$iterator变量上的任何其他操作都会导致代码崩溃.

如何才能访问完整的响应ListBucketResult

Jer*_*lom 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.
Run Code Online (Sandbox Code Playgroud)