AWS S3 C ++: список всех объектов, когда результат усечен - PullRequest
0 голосов
/ 03 октября 2018

Я использую следующий код для перечисления всех ключей в моем контейнере 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);
}

1 Ответ

0 голосов
/ 03 октября 2018

Согласно документации для NextMarker:

Примечание

Этот элемент возвращается, только если вы указали параметр запроса разделителя.Если ответ не включает в себя NextMarker и он усечен, вы можете использовать значение последнего ключа в ответе в качестве маркера в последующем запросе, чтобы получить следующий набор ключей объекта.

Следовательно, ваш код должен быть:

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

Также обратите внимание, что метод ListObjects V1 устарел, вы должны использовать ListObjectsV2 , который использует явные токены продолжения, которые немного проще в использовании.

...