我试图仅获取 S3 存储桶文件夹中的第一个文件。
使用官方 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
)
)
我应该如何正确地做到这一点?
谢谢
最佳答案
'MaxKeys'
参数应用于操作,而不是迭代器,因此您实际上执行了一堆 ListObjects
操作,每个操作返回一个对象,直到所有对象均已返回。
相反,您需要对迭代器施加限制,如 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'sIterator
interface ,并且在您实际迭代它之前不执行任何操作(例如,使用foreach
)。当您迭代它时,它会逐一发出有关在响应中找到的每个对象的数据。它将根据需要向 S3 发出其他请求,直到返回与请求参数匹配的所有对象,或者达到指定的限制
。
关于php - AWS PHP 开发工具包 getIterator() 和 MaxKeys,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21530035/