亚马逊S3倒序列出对象

7

目前,当我调用$s3->list_objects()方法时,它会按照添加对象的顺序返回对象。我希望以相反的顺序列出对象,以便首先显示最新的对象。我找不到可以传递给$s3->list_objects()方法以反转顺序的参数。我正在使用Amazon S3 PHP SDK。是否有这样的参数或方法?


你有查看文档吗? - Jan Hančič
我确实查看了文档。然后我来到了这里的SO :( - Khawer Zeshan
2
为了帮助到任何来到这里的人,AWS S3将以字母顺序返回对象,而不一定是它们被添加的顺序。请参阅http://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketGET.html中的“marker”参数。 - CLo
2个回答

3

我想做同样的事情,但不想用数据库来跟踪最新的对象。由于您只需要按字母顺序反向排序键。

通常,时间戳是按字母顺序排列的。时间戳可以表示为long类型。我们可以通过(最大long-时间戳long)获取反向字母时间标识符,并使用所有前导0格式化它。

因此,如果您使用键=前缀+时间戳ID +后缀来存储S3对象,那么可以使用列表来获取最新的对象。


0
< p > list_objects() 返回的对象是 Guzzle\Service\Resource\Model,因此您需要使用该类提供的方法进行操作。为了执行像下面评论中提到的分页请求,您可能需要执行以下操作:

$object_array = array();
$continue = true;
$list_params = array('Bucket' => 'your_aws_bucket', 'MaxKeys' => 1000);
while (true === $continue) {
    $result_obj = $s3->list_objects($list_params);
    $current_array = $result_obj->get('Contents');
    $object_array = array_merge($object_array, $current_array);
    $is_truncated = $result_obj->get('isTruncated');
    if ($is_truncated) {
        $list_params['Marker'] = $result_obj->get('NextKeyMarker');
    } else {
        $continue = false;
    }
}  
$reversed_array = array_reverse($object_array);

请注意,如果您要处理10万个文件,可能会发现将所有文件的整个数组保留在内存中变得有问题,因此您可能需要重新考虑您提出的需要将所有文件都保存在内存中的想法。

假设存储桶中有100,000个文件。数组可以在单个请求中返回给我10,000个键,然后我可以将其反转。但这不是问题,它只会反转这10,000个键。当我为下一个10,000个键做第二个请求时,我必须再次反转它。但如果存储桶中有超过10,000个键,则前10,000个键不是最新的。我希望我解释清楚了问题? - Khawer Zeshan
@KhawerZeshan 你应该更新原问题,因为这肯定会影响你的方法。我已经更新了我的答案以反映这个新的用例。 - Mike Brant

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接