如何使用 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 表达式,但没有成功。
Size>0
// returns 错误:意外的数字标记
Size>'0'
// 成功:returns 无结果
Size>`0`
// 成功:returns 无结果
Size!=`0`
// returns 结果但不过滤掉零大小的对象
Size!=\"0\"
// returns 结果但不过滤掉零大小的对象
请注意,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 没有声明 Size
的 long
类型的映射作为。它退回到此处将其解析为字符串的默认行为:
https://github.com/aws/aws-sdk-php/blob/master/src/Api/Parser/XmlParser.php#L23-L31
我需要一些帮助来使用适用于 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 表达式,但没有成功。
Size>0
// returns 错误:意外的数字标记Size>'0'
// 成功:returns 无结果Size>`0`
// 成功:returns 无结果Size!=`0`
// returns 结果但不过滤掉零大小的对象Size!=\"0\"
// returns 结果但不过滤掉零大小的对象
请注意,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 没有声明 Size
的 long
类型的映射作为。它退回到此处将其解析为字符串的默认行为:
https://github.com/aws/aws-sdk-php/blob/master/src/Api/Parser/XmlParser.php#L23-L31