我试图只获取S3 Bucket文件夹中的第一个文件。
使用官方PHP SDK,我的代码如下:
$client = S3Client::factory(array('key'=>'...','secret'=>'...'));
$result = $client->getIterator('ListObjects',array(
'Bucket' => 'my_bucket_name',
'Prefix' => 'myfolder/',
'MaxKeys' => 1,
));
foreach($result as $object)
{
...
}
现在,看起来MaxKeys参数没有做任何事情,因为这个结果包含'myfolder'中的所有文件
再次阅读文档,似乎getIterator基本上一直向AWS运行查询,直到从那里获取所有文件, 有什么方法可以将它限制为只有一个吗?
我也试过在没有getIterator的情况下运行查询,如下所示:
$result = $client->ListObjects(array(
'Bucket' => 'my_bucket_name',
'Prefix' => 'myfolder/',
'MaxKeys' => 1,
));
在这种情况下,我只获取文件夹名称而不是文件,并且格式完全不同,我猜它是第一个:
Iterator Object
(
[storage:ArrayIterator:private] => Array
(
[Name] => my_bucket_name
[Prefix] => myfolder/
[Marker] => Array
(
)
[MaxKeys] => 1
[IsTruncated] => 1
[Contents] => Array
(
[0] => Array
(
[Key] => myfolder/
[LastModified] => 2014-02-03T13:17:55.000Z
[ETag] => "d41d8cd98f00b204e9800998ecf8427e"
[Size] => 0
[Owner] => Array
(
[ID] => ...
[DisplayName] => amazon
)
[StorageClass] => STANDARD
)
)
[EncodingType] =>
[RequestId] => E5TYHGG24FE73D8
)
)
我该如何正确地做到这一点?
由于
答案 0 :(得分:3)
'MaxKeys'
参数应用于操作,而不是迭代器,因此您实际上正在执行一堆ListObjects
操作,每个操作返回一个对象,直到返回所有对象。 / p>
相反,您需要按照iterators section的AWS SDK for PHP User Guide中的说明对迭代器设置限制。
$iterator = $client->getListObjectsIterator(array(
'Bucket' => 'my-bucket'
), array(
'limit' => 1,
));
foreach ($iterator as $object) {
echo $object['Key'] . "\n";
}
// This should only print 1 object's key.
同时执行->listObjects()
和getIterator('ListObjects')
会做不同的事情。
->listObjects()
执行单个S3 ListObjects操作,并将完整结果作为Guzzle\Service\Resource\Model
返回,这只是一个行为类似于数组的对象。见Modeled Responses。->getIterator('ListObjects')
返回Aws\Common\Iterator\AwsResourceIterator
对象,该对象实现PHP's Iterator
interface,并且在您实际迭代它之前不执行任何操作(例如,使用foreach
)。迭代它时,它会在响应中逐个发出有关每个对象的数据。它将根据需要向S3发出其他请求,直到返回了与请求参数匹配的所有对象,或者达到指定的limit
。答案 1 :(得分:0)
foreach ($result->getIterator() as $object) {
.... do stuff with $object;
break(); // terminate the loop
}