Amazon S3 调用 ListObjects 时对 MaxKeys 有限制吗?

问题描述 投票:0回答:4

我一直认为在 Amazon S3 中调用 ListObjects 时有 1,000 个密钥限制。不过,我刚刚打了个电话,结果是 1,080。但即使他们的 docs 也说限制为 1,000。

我尝试将 MaxKeys 设置设置为 1,000,但它仍然会提取 1,080 个结果。我的代码:

$iterator = $s3->getIterator('ListObjects', array(
    'Bucket' => 'BUCKETNAME',
    'MaxKeys' => 1000
));

然而,它正在将文件夹作为密钥。但我肯定没有 80 个。

两个问题:

  1. 我的代码有错吗?
  2. 亚马逊解除1000个密钥限制了吗?有新的限制吗?
amazon-s3
4个回答
15
投票

S3 API 限制没有改变,仍然限制为最多 1000 个密钥/响应。

使用 PHP SDK v1,单个请求最多返回 1000 个键,要获取其余键,您需要使用

marker
选项执行第二个请求。

新的 PHP SDK (v2) 有一个迭代器的概念,它抽象了执行这些多个连续请求的过程。这使得获取所有对象变得更加容易。


2
投票

默认情况下,API 最多返回 1,000 个键名称。响应可能包含较少的键,但绝不会包含更多。更好的实现是使用更新的 ListObjectsV2 API:

 List<S3ObjectSummary> docList=new ArrayList<>();
    ListObjectsV2Request req = new ListObjectsV2Request().withBucketName(bucketName).withPrefix(folderFullPath);
    ListObjectsV2Result listing;
    do{
        listing=this.getAmazonS3Client().listObjectsV2(req);
        docList.addAll(listing.getObjectSummaries());
        String token = listing.getNextContinuationToken();
        req.setContinuationToken(token);
        LOG.info("Next Continuation Token for listing documents is :"+token);
    }while (listing.isTruncated());

0
投票

AWS s3 提供最多 1000 个文件列表,以便获得超过 1000 个计数来使用此方法

对于 javascript 使用这种方法

https://stackoverflow.com/a/69754448/8239116


0
投票

PHP 示例(如果有人需要):

$objects = [];
$continuationToken = NULL;
do {
  $result = $this->s3->listObjectsV2([
    'Bucket' => $sourceBucket,
    'Prefix' => $sourceFolderPath,
    'ContinuationToken' => $continuationToken,
  ]);

  $objects = array_merge($objects, $result['Contents']);
  $continuationToken = $result['NextContinuationToken'] ?? NULL;
} while ($continuationToken);
© www.soinside.com 2019 - 2024. All rights reserved.