【问题标题】:aws c++ sdk s3 ListObjects in oldest to newest orderaws c++ sdk s3 ListObjects按最旧到最新的顺序
【发布时间】:2021-09-28 04:08:40
【问题描述】:

使用 AWS SDK for C++ ListObjectsRequest,有没有办法让 SDK 根据 Set Marker 的值返回存储桶中的最新对象?在下面的代码中,问题在于 object_list 向量中的对象从最新到最旧。因此,将“last_key”设置为“back()”元素的键会导致下一次循环中的结果为 0(因为没有什么比“last_key”更早。)

如果我将“last_key”设置为“front()”的键值,您最终会再次循环遍历相同的存储桶对象。

有没有办法使用“last_key”告诉 SDK 获取比“last_key”更新的对象?

Aws::String last_marker;
while(true) {
  Aws::S3::Model::ListObjectsRequest objects_request;
  objects_request.WithBucket(bucket);
  if (last_key.length() > 0) {
     objects_request.SetMarker(last_key);
  }
  Aws::S3::Model::ListObjectsOutcome outcome;
  outcome = s_client.ListObjects(objects_request);
  Aws::Vector<Aws::S3::Model::Object> object_list = 
  outcome.GetResult().GetContents();
  //loop through object vector.
  last_marker.assign(object_list.back().GetKey());
}

【问题讨论】:

    标签: c++ amazon-web-services aws-sdk aws-sdk-cpp


    【解决方案1】:

    通常,您提供给 ListObjects 调用的标记是在您之前调用 ListObjects 的结果中返回给您的“下一个标记”。这是一个分页标记。不,它不支持“迟于”的概念,这是一个基于时间戳的概念,而标记与 S3 对象键相关,而不是时间戳。

    另请注意:您应该使用 ListObjectsV2 而不是 ListObjects。

    【讨论】:

    • 感谢您的解释。那么我是否要确定在存储桶中返回比上次检查时更新的对象的唯一方法是删除旧对象?
    • 您可以在 SDK 文档中查看 ListObjects 的可用参数。没有与时间戳相关的选项。您可能会在 S3 对象键中的某处包含时间戳,例如前缀 2021/07/20/ 允许您列出特定日期的对象(如果包含时间组件,则为时间)。另见client-side filtering solution
    • 非常有帮助。谢谢!
    • 我想知道为什么不能在 ListObjectsRequest 中添加类似“--query 'Contents[?LastModified > '"$SINCE"']'”的内容。
    • @user3472 您指的是 awscli --query 功能。这是一个客户端功能。 ListObjects API 不实现此功能。
    猜你喜欢
    • 2012-07-14
    • 1970-01-01
    • 2019-05-13
    • 2016-07-14
    • 2019-10-20
    • 1970-01-01
    • 2015-10-28
    • 2019-01-19
    相关资源
    最近更新 更多