【问题标题】:S3 listObjectsV2 - StartAfter does not show intended resultsS3 listObjectsV2 - StartAfter 未显示预期结果
【发布时间】:2019-04-05 11:39:26
【问题描述】:

我正在尝试获取存储桶中某个标识符之后的所有文件。

这是我的代码,省略了不相关的部分。

require_once LIB . DS . 'Aws/vendor/autoload.php';
use Aws\S3\S3Client as S3Client;
use Aws\Credentials as Credentials;

$s3 = new S3Client([
        'region'      => $region,
        'version'     => 'latest',
        'key'    => AWS_KEY,
        'secret' => AWS_SECRET,
        'credentials' => $credentials
    ]
);

$data = $s3->listObjectsV2(
                           [
                               'Bucket' => <MY BUCKET>,
                               // the response content should be after this record
                               'StartAfter' => '302760677',
                               'MaxKeys' => 2
                          ]);
print_r($data);

我得到的结果如下:

Aws\Result Object
(
    [data:Aws\Result:private] => Array
        (
            [IsTruncated] => 1
            [Contents] => Array
                (
                    [0] => Array
                        (
                            [Key] => json/300705/300705046/status.json
                            [LastModified] => Aws\Api\DateTimeResult Object
                                (
                                    [date] => 2018-06-20 11:45:06.000000
                                    [timezone_type] => 2
                                    [timezone] => Z
                                )
                            [ETag] => "2777f5fabc31969108b16cd8459d3b5d"
                            [Size] => 945
                            [StorageClass] => STANDARD
                        )
                    [1] => Array
                        (
                            [Key] => json/300705/300705046/address.json
                            [LastModified] => Aws\Api\DateTimeResult Object
                                (
                                    [date] => 2018-06-20 11:45:06.000000
                                    [timezone_type] => 2
                                    [timezone] => Z
                                )

                            [ETag] => "3fd8ef54a83e93d470f5438079f51345"
                            [Size] => 477
                            [StorageClass] => STANDARD
                        )
                )
        )
)

这里,返回的响应内容显示键的数据 - 300705046,小于我在请求的“StartAfter”节点中指定的数据。

谁能帮我理解我可能做错了什么。

谢谢

【问题讨论】:

    标签: php amazon-web-services amazon-s3 aws-sdk aws-php-sdk


    【解决方案1】:

    StartAfter (docs) 与完整密钥匹配。

    例如,您可以尝试使用以下方式请求:

    'StartAfter' => 'json/302760/302760677/address.json',
    

    【讨论】:

    • 哦!这行得通,非常感谢!从文档中,我假设它将扫描具有给定标识符的路径,然后计算其余部分。显然,情况并非如此。
    【解决方案2】:

    'StartAfter' 将返回任何大于该值的键。在您的情况下,您将“StartAfter”设置为“302760677”,它小于键“json/300705/300705046/status.json”。请尝试以下方法:

    'StartAfter' => 'json/302760/302760677'
    

    'StartAfter' => 'json/302760/302760677/'
    

    甚至

    'StartAfter' => 'json/302760/302760677/a'
    

    您可能希望改用 Prefix,这样您就不必预测文件夹中的确切项目数。在这种情况下,您将使用:

    'Prefix' => 'json/302760/302760677/'
    

    如果您明确创建 s3 文件夹对象(例如,'json/302760/302760677/')并且不想在查询中恢复该文件夹对象,则可以将其指定为 Prefix 和 StartAfter 以及它只会给你内容。

    【讨论】:

    • 我在发布之前进行了测试。不知道该说什么...
    • 这也符合我对 StartAfter 的简单 > 实现的期望,您将从具有 order by 的数据库中获得。所以除了工作之外,这似乎是合理的。
    • 你说得对,删除我的评论。我的马虎!谢谢你教我一些东西!
    猜你喜欢
    • 1970-01-01
    • 2011-10-02
    • 2022-08-14
    • 2021-04-14
    • 2020-09-19
    • 2021-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多