首页 > 解决方案 > 亚马逊示例 transfermanager 代码无法编译

问题描述

我无法找到 AWS C++ SDK 传输管理器的工作示例。AWS 提供的示例在 Ubuntu 18.04 上使用 GCC 7.0.4 编译失败它有很多错误,首先是没有 TransferManagerConfiguration 的默认构造函数。

我实际上是在尝试找到某种方法来使用 C++ SDK 获取大于 2GB 的对象。我可以用其他语言这样做。我正试图让转移经理工作,看看是否能解决这个问题。但我无法获取 Amazon 提供的示例代码以在 Windows 或 Linux 上构建。该示例来自他们的“准备生产”博客文章。

#include <aws/core/Aws.h>
#include <aws/s3/S3Client.h>
#include <aws/transfer/TransferManager.h>

static const char* ALLOC_TAG = "main";

int main()
{
    Aws::SDKOptions options;
    Aws::InitAPI(options);

    auto s3Client = Aws::MakeShared<Aws::S3::S3Client>(ALLOC_TAG);
    Aws::Transfer::TransferManagerConfiguration transferConfig;
    transferConfig.s3Client = s3Client;

    transferConfig.transferStatusUpdatedCallback =
        [](const TransferManager*, const TransferHandle& handle)
    { std::cout << "Transfer Status = " <<   static_cast(handle.GetStatus()) << "\n"; }

        transferConfig.uploadProgressCallback =
        [](const TransferManager*, const TransferHandle& handle)
    { std::cout << "Upload Progress: " << handle.GetBytesTransferred() << " of "
        << handle.GetBytesTotalSize() << " bytes\n"; };

    transferConfig.downloadProgressCallback =
        [](const TransferManager*, const TransferHandle& handle)
    { std::cout << "Download Progress: " << handle.GetBytesTransferred() << " of "
        << handle.GetBytesTotalSize() << " bytes\n"; };

    Aws::Transfer::TransferManager transferManager(transferConfig);
    auto transferHandle = transferManager.UploadFile("/user/aws/giantFile",
        "aws_cpp_ga", "giantFile",
        "text/plain", Aws::Map<Aws::String, Aws::String>());
    transferHandle.WaitUntilFinished();

    Aws::ShutdownAPI(options);
    return 0;
}

我希望它能够构建和上传文件。

标签: c++awss3transfermanager

解决方案


这是我的首选模板。真的很烦 Aws 忘记更新它的教程。

#include <aws/core/Aws.h>
#include <aws/s3/S3Client.h>
#include <aws/transfer/TransferManager.h>

static const char *ALLOC_TAG = "main";

/*
 * referenced from:
 * https://github.com/aws/aws-sdk-cpp/blob/master/aws-cpp-sdk-transfer-tests/TransferTests.cpp
 */

int main() {
  Aws::SDKOptions options;
  // for debug purpose since transfer mngr fails silently.
  options.loggingOptions.logLevel = Aws::Utils::Logging::LogLevel::Info;
  Aws::InitAPI(options);

  Aws::Client::ClientConfiguration clientConfiguration;
  clientConfiguration.endpointOverride = "https//store-test.example.com";
  clientConfiguration.region = "store-test";

  using namespace Aws::Transfer;
  using namespace Aws::Utils;

  auto s3Client = Aws::MakeShared<Aws::S3::S3Client>(ALLOC_TAG, clientConfiguration);
  auto thread_executor =
      Aws::MakeShared<Threading::PooledThreadExecutor>(ALLOC_TAG, 4);

  Aws::Transfer::TransferManagerConfiguration transferConfig(
      thread_executor.get());
  transferConfig.s3Client = s3Client;

  transferConfig.transferStatusUpdatedCallback =
      [](const TransferManager *,
         const std::shared_ptr<const TransferHandle> &handle) {
        std::cout << "Transfer Status = "
                  << static_cast<int>(handle->GetStatus()) << "\n";
      };

  transferConfig.uploadProgressCallback =
      [](const TransferManager *,
         const std::shared_ptr<const TransferHandle> &handle) {
        std::cout << "Upload Progress: " << handle->GetBytesTransferred()
                  << " of " << handle->GetBytesTotalSize() << " bytes\n";
      };

  auto transferManager = TransferManager::Create(transferConfig);
  auto transferHandle = transferManager->UploadFile(
      "/user/aws/giantFile", "aws_cpp_ga", "giantFile", "text/plain",
      Aws::Map<Aws::String, Aws::String>());

  transferHandle->WaitUntilFinished();
  /* you may need to reset the thread pool before shutdown API */
  thread_executor.reset();
  Aws::ShutdownAPI(options);
  return 0;
}

推荐阅读