Usar o TransferManager em operações do Amazon S3 - AWS SDK para C++

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Usar o TransferManager em operações do Amazon S3

Você pode usar a classe TransferManager do AWS SDK para C++ para transferir arquivos de maneira confiável do ambiente local para o Amazon S3 e copiar objetos de um local do Amazon S3 para outro. O TransferManager pode captar o andamento de uma transferência e pausar ou retomar uploads e downloads.

nota

Para evitar a cobrança por uploads incompletos ou parciais, recomendamos que você habilite a regra de ciclo de vida AbortIncompleteMultipartUpload em seus buckets do Amazon S3.

Essa regra faz com que o Amazon S3 anule multipart uploads que não sejam concluídos em um número específico de dias depois de serem iniciados. Quando o limite de tempo definido é excedido, o Amazon S3 anula o upload e exclui os dados de uploads incompletos.

Para acessar mais informações, consulte Definir configuração do ciclo de vida em bucket no Guia do usuário do Amazon S3.

Pré-requisitos

Antes de começar, recomendamos que você leia Getting started using the AWS SDK para C++.

Baixe o exemplo código de código e crie a solução conforme descrito em Conceitos básicos dos exemplos de código.

Para executar os exemplos, o perfil de usuário que seu código usa para fazer as solicitações deve ter as permissões adequadas na AWS (para o serviço e a ação). Para acessar mais informações, consulte Fornecer credenciais da AWS.

Upload e download de um objeto usando TransferManager

Este exemplo demonstra como o TransferManager transfere objetos grandes na memória. Os métodos UploadFile e DownloadFile são chamados de forma assíncrona e exibem o TransferHandle para gerenciar o status da sua solicitação. Se o objeto do qual foi feito upload for maior que bufferSize, será realizado um multipart upload. O bufferSize tem como padrão 5 MB, mas isso pode ser configurado por TransferManagerConfiguration.

auto s3_client = Aws::MakeShared<Aws::S3::S3Client>("S3Client"); auto executor = Aws::MakeShared<Aws::Utils::Threading::PooledThreadExecutor>("executor", 25); Aws::Transfer::TransferManagerConfiguration transfer_config(executor.get()); transfer_config.s3Client = s3_client; // Create buffer to hold data received by the data stream. Aws::Utils::Array<unsigned char> buffer(BUFFER_SIZE); // The local variable 'streamBuffer' is captured by reference in a lambda. // It must persist until all downloading by the 'transfer_manager' is complete. Stream::PreallocatedStreamBuf streamBuffer(buffer.GetUnderlyingData(), buffer.GetLength()); auto transfer_manager = Aws::Transfer::TransferManager::Create(transfer_config); auto uploadHandle = transfer_manager->UploadFile(LOCAL_FILE, BUCKET, KEY, "text/plain", Aws::Map<Aws::String, Aws::String>()); uploadHandle->WaitUntilFinished(); bool success = uploadHandle->GetStatus() == Transfer::TransferStatus::COMPLETED; if (!success) { auto err = uploadHandle->GetLastError(); std::cout << "File upload failed: "<< err.GetMessage() << std::endl; } else { std::cout << "File upload finished." << std::endl; auto downloadHandle = transfer_manager->DownloadFile(BUCKET, KEY, [&]() { //Define a lambda expression for the callback method parameter to stream back the data. return Aws::New<MyUnderlyingStream>("TestTag", &streamBuffer); }); downloadHandle->WaitUntilFinished();// Block calling thread until download is complete. auto downStat = downloadHandle->GetStatus(); if (downStat != Transfer::TransferStatus::COMPLETED) { auto err = downloadHandle->GetLastError(); std::cout << "File download failed: " << err.GetMessage() << std::endl; } std::cout << "File download to memory finished." << std::endl;

Veja o exemplo completo no GitHub.