这是我的方法:
public function listVersionsForPath($s3Path, $bucketName, $offset, $limit) {
$versions = array();
$tmpS3Path = $this->cleanS3Path($s3Path);
$fullBucketName = self::getFullBucketName($bucketName);
$request = array(
'Bucket' => $fullBucketName,
'Prefix' => $tmpS3Path,
'MaxKeys' => 100,
'VersionIdMarker' => ???,
);
$iterator = $this->client->getListObjectVersionsIterator($request);
foreach ($iterator as $object) {
if(!isset($versions[$object['Key']])) {
$versions[$object['Key']] = array();
}
$versions[$object['Key']][] = $object['VersionId'];
}
return $versions;
}
我需要将返回的版本数量限制为至少100,因为我有一个1000多个版本的对象使PHP直接崩溃。但是,我不知道如何跳过前100个版本,让它们内存不足,然后加载下一个版本。
最后,我至少找到了S3请求中所有有效选项的列表。如果您在aws.phar中打开S3Client.php,那么在第184行上有一个AWS的列表,相当于'offset'。基本上,您必须获取对象列表,然后将偏移量设置为上一个列表中最后一个键的值。我自己还没能做到这一点,我正在使用继续;休息假的分页。
答案 0 :(得分:1)
在AWS S3对象版本列表中获取偏移量的唯一方法是遍历前X个条目,丢弃它们,然后仅返回所请求的条目。这是我上次使用此代码的时间(3年前)对API的限制。
答案 1 :(得分:0)
我认为您可以使用StartAfter
来补偿,但是您需要一个键来开始补偿。为此,获取约100个项目,并记录最后一个的ID。然后,您可以使用StartAfter
从该ID开始。这不是完美的,但它是最好的。
// 1) get items
const { Contents, IsTruncated } = await s3.listObjectsV2({
Bucket
MaxKeys: 100,
}).promise()
// 2) remember last key
const last = Contents[Contents.length-1].Key
// 3) query via StartFrom
const { Contents } = await s3.listObjectsV2({
Bucket,
MaxKeys: 100,
StartAfter: last,
}).promise()