我一直认为在 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 个。
两个问题:
S3 API 限制没有改变,仍然限制为最多 1000 个密钥/响应。
使用 PHP SDK v1,单个请求最多返回 1000 个键,要获取其余键,您需要使用
marker
选项执行第二个请求。
新的 PHP SDK (v2) 有一个迭代器的概念,它抽象了执行这些多个连续请求的过程。这使得获取所有对象变得更加容易。
默认情况下,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());
AWS s3 提供最多 1000 个文件列表,以便获得超过 1000 个计数来使用此方法
对于 javascript 使用这种方法
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);