php - AWS PHP 开发工具包 getIterator() 和 MaxKeys

标签 php amazon-web-services amazon-s3

我试图仅获取 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's Iterator interface ,并且在您实际迭代它之前不执行任何操作(例如,使用 foreach)。当您迭代它时,它会逐一发出有关在响应中找到的每个对象的数据。它将根据需要向 S3 发出其他请求,直到返回与请求参数匹配的所有对象,或者达到指定的限制

关于php - AWS PHP 开发工具包 getIterator() 和 MaxKeys,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21530035/

相关文章:

php - Web 表单中的外键

javascript - 自动将文本内容拆分为偶数列

amazon-web-services - 维护 Jenkins 中多个 cloudformation 堆栈之间的部署顺序

amazon-web-services - AWS Cloudformation 数据库实例 IAM 角色

php - 使用 PHP-FFmpeg 创建图像视频缩略图

php - 如何通过外键过滤SQL中的表?

python - Amazon 的 Alexa Skill Kit (ASK) Lambda 交互故障排除

amazon-web-services - Fn::ImportValue 未扩展

reactjs - 为什么我无法显示上传到 S3 的图像(.svg)

python - 如何在 Python 中使用 Pandas 从 s3 存储桶中读取 csv 文件