【问题标题】:AWS S3 C++ : List all the object when result is truncatedAWS S3 C++:当结果被截断时列出所有对象
【发布时间】:2018-10-03 13:23:20
【问题描述】:

我使用以下代码列出了我的 S3 存储桶中的所有键。

我的桶中有大约 15,000 个对象。然而,这段代码只是无限循环地遍历前 1000 个对象。似乎它不尊重 SetMarker() 方法。

关于如何解决这个问题的任何提示?

#include <aws/s3/S3Client.h>
#include <aws/s3/model/ListObjectsRequest.h>
#include <aws/s3/model/Object.h>

int main(int argc, const char* argv[])
{
    Aws::SDKOptions options;
    Aws::InitAPI(options);
    {
        Aws::Client::ClientConfiguration config;
        config.region="ap-northeast-1";

        Aws::S3::S3Client s3_client(config);
        Aws::S3::Model::ListObjectsRequest objects_request;

        objects_request.WithBucket("MYBUCKETNAME").WithPrefix("some-prefox");

        bool isDone = false;
        bool isFailed= false;
        Aws::S3::Model::ListObjectsOutcome outcome;
        int c=0;

        while(!isDone) {
                 outcome=s3_client.ListObjects(objects_request);
                 if(!outcome.IsSuccess()) break;
                 //process
                 Aws::Vector<Aws::S3::Model::Object> object_list = outcome.GetResult().GetContents();

                 for (auto const &s3_object : object_list)
                {
                    std::cout << "* " << s3_object.GetKey() << std::endl;
                    c++;

                }
                std::cout<<"--------- Break"<<c<<"\n";
                 isDone=!outcome.GetResult().GetIsTruncated();
                 if(!isDone) {
                    objects_request.SetMarker(outcome.GetResult().GetNextMarker());

                }
            }
            std::cout << "Count "<<c<<"\n";
            //check isFailed
            if(!outcome.IsSuccess()) {
                std::cout << "ListObjects error: " <<
                outcome.GetError().GetExceptionName() << " " <<
                outcome.GetError().GetMessage() << std::endl;
            }

    }

    Aws::ShutdownAPI(options);
}

【问题讨论】:

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


    【解决方案1】:

    根据 NextMarker 的documentation

    注意

    仅当您指定分隔符请求参数时才会返回此元素。如果响应中不包含 NextMarker 并且被截断,则可以将响应中最后一个 Key 的值作为后续请求中的标记来获取下一组对象键。

    因此,您的代码应该是:

    if(!isDone) {
      objects_request.SetMarker(outcome.GetResult().GetContents().back().GetKey());
    }
    

    另请注意,V1 ListObjects 方法已弃用,您应该使用ListObjectsV2,它使用更易于使用的显式延续标记。

    【讨论】:

    • Birties :感谢您的提示.. 它起作用了.. 但是 ListObjectsV2 未能给出错误“ListObjects 错误:InvalidArgument 无法解析 ExceptionName:InvalidArgument 消息:提供的延续令牌不正确”
    • @AshikaUmangaUmagiliya 我猜你没有正确使用它,用你的完整代码发布一个新问题,我相信有人会告诉你什么是错的。
    猜你喜欢
    • 2015-10-23
    • 2022-01-05
    • 2020-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多