如何在 AWS S3 对象版本列表中获取"offset"?



这是我的方法:

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 个版本,将它们从内存中取出,然后加载下一个 100 个版本。

最后,我至少找到了 S3 请求中所有有效选项的列表。如果您在 aws.phar 中打开 S3Client.php则在第 184 行有一个列表,列出了 AWS 相当于"偏移量"的内容。基本上,您必须获取对象列表,然后将偏移量设置为上一个列表中的最后一个键的值。我自己还不能做到这一点,我正在使用继续;和休息;用于假分页。

在 AWS S3 对象版本列表中获取偏移量的唯一方法是迭代前 X 个条目,丢弃它们,然后仅返回请求的条目。这是我上次处理此代码(3 年前)的 API 的限制。

我认为

您可以使用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()

最新更新