簡體   English   中英

如何使用 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 開發工具包過濾 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

但是如果我用StorageClass=='STANDARD'替換Size> `0` ,我會按預期得到 10 個最近的對象。

我嘗試了以下 Size 表達式,但沒有任何運氣。

  • Size>0 // 返回錯誤:意外的數字標記
  • Size>'0' // 成功:不返回結果
  • Size>`0` // 成功:不返回結果
  • Size!=`0` // 返回結果但不過濾掉零大小的對象
  • Size!=\\"0\\" // 返回結果但不過濾掉零大小的對象

請注意, s2api 查詢工作正常,因此這似乎與 PHP SDK Search 方法有關。

--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']

正如文檔所述,這似乎是一個錯誤,或者至少是文檔中的一個錯誤:

AWS CLI 支持 JMESPath。 您為 CLI 輸出編寫的表達式與為 AWS SDK for PHP 編寫的表達式 100% 兼容。

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 必須支持無法處理超過 20 億的整數的 32 位環境,以及 b)一般而言,所有 AWS 開發工具包都是從一組與語言無關的數據文件中自動生成的,他們傾向於在可以避免的情況下避免出現異常。 這似乎意味着將字符串用作整數可能會在整個 SDK 中廣泛出現。 也就是說,我在其他地方找不到任何提及。


無論是否有意,似乎是因為 PHP SDK 的 Api/Parser/XmlParser 沒有Size聲明為的long類型的映射。 它回退到此處將其解析為字符串的默認行為:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM