如何使用 AWS SDK for PHP v3 Aws/ResultPaginator->Search 和 JMESPath 表达式按大小过滤 S3 对象?

How can I filter S3 objects by size using AWS SDK for PHP v3 Aws/ResultPaginator->Search and JMESPath expression?

我需要一些帮助来使用适用于 PHP v3 和 JMESPath 的 AWS SDK 过滤 S3 结果。正如 JMESPath 文档和在线示例所建议的那样,按数字过滤不适用于 PHP SDK。

<?php
// test.php

use Aws\S3\S3Client;

// Create S3 client
$s3 = new S3Client([
    'version' => 'latest',
    'region'  => 'us-east-1'
]);

$bucket = 'my-bucket-name';
$prefix = 'path/to/my/objects';

// Call list-objects-v2
$awspaginator = $s3->getPaginator('ListObjectsV2', [
    'Bucket' => $bucket,
    'Prefix' => $prefix
]);

// Apply filter to paginator
$jmes = "reverse(Contents[?Size>`0`].{Key: Key, Date: LastModified, Size: Size}) | [-10:]";
$results = $awspaginator->search($jmes);

// Echo results
$i = 0;
foreach ($results as $result) {
    echo "\nResult: " . print_r($result);
    $i++;
}
echo "\nCount: " . $i . PHP_EOL;
?>

这输出 计数:0

但是,如果我将 Size> `0` 替换为 StorageClass=='STANDARD',我将按预期获得 10 个最近的对象。

我尝试了以下 Size 表达式,但没有成功。

请注意,s2api 查询工作得很好,所以这似乎与 PHP SDK 搜索方法有关。

--bucket my-bucket-name \
--prefix path/to/my/objects \
--query "reverse(Contents[?Size>\`0\`].{Key: Key, Date: LastModified, Size: Size}) | [-10:]"

感谢任何帮助!

我很难在任何地方找到此文档,但 Size 似乎未编组为字符串。我能够使您的示例与 [?to_number(Size)>`0`][?Size!='0'].

一起工作

这似乎是一个错误,或者至少是文档中的一个错误,如文档所述:

The AWS CLI supports JMESPath. Expressions you write for CLI output are 100 percent compatible with expressions written for the AWS SDK for PHP.

https://docs.aws.amazon.com/sdk-for-php/v3/developer-guide/guide_jmespath.html

我唯一能找到甚至暗示这种行为的东西只是微不足道的相关:

https://forums.aws.amazon.com/message.jspa?messageID=752541#jive-message-312324

这里的问题是 DynamoDB API 期望接收字符串形式的数字,亚马逊代表指出此行为是 a) 因为 SDK 必须支持不能支持的 32 位环境处理超过 20 亿的整数,并且 b) 通常,所有 AWS SDK 都是从一组与语言无关的数据文件中自动生成的,并且他们更愿意在可以避免的情况下避免出现异常。这似乎意味着在整个 SDK 中可能会广泛使用字符串作为整数。也就是说,我在其他地方找不到任何提及。


无论是否有意,这似乎是因为 PHP SDK 的 Api/Parser/XmlParser 没有声明 Sizelong 类型的映射作为。它退回到此处将其解析为字符串的默认行为:

https://github.com/aws/aws-sdk-php/blob/master/src/Api/Parser/XmlParser.php#L23-L31