首页 > 解决方案 > 在适用于 C++ 的 AWS s3 开发工具包中执行 PutObjectCallableRequest

问题描述

在使用适用于 C++ 的 AWS S3 开发工具包时,我想执行多线程以上传对象并获取可调用消息。

例如:当我将 10 张图片上传到我的 s3 存储桶时,一个不同的线程正在增加一个计数器。上传完成后,我应该得到一个可调用的对象或指针,它将停止我的计数器增量。

我想要一个线程安全库,以便我可以并行上传/下载或处理文件

PutObjectCallableRequest类可用,但未定义参数类型和定义。我如何执行此任务。我不想使用任何 API,必须使用 s3 SDK 库。

我附上了一个链接到示例代码,该示例代码在适用于 C++ 的 aws s3 SDK 中使用 PutObjectRequest 上传对象。

https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/cpp/example_code/s3/put_object.cpp

这应该是一个线程。如果我还想并行列出我的存储桶的对象,我应该使用什么库?

编辑:

这就是我想要实现的。如何更改以下代码以实现异步操作并获取回调。

#include <aws/core/Aws.h>
#include <aws/core/client/ClientConfiguration.h>
#include <aws/core/http/Scheme.h>
#include <aws/core/utils/threading/Executor.h>
#include <aws/s3/S3Client.h>
#include <aws/transfer/TransferManager.h>

using namespace std;
using namespace Aws::S3;
using namespace Aws::S3::Model;
using namespace Aws::Client;
using namespace Aws::Http;


static const char* const ALLOCATION_TAG = "S3_MULTIPART_TEST";

int main(int /*argc*/, char** /*argv*/)
{
    Aws::SDKOptions options;
    Aws::InitAPI(options);

    Aws::String bucket = "your-bucket-name";

    // Set up S3 client
    ClientConfiguration config;
    config.region = "us-east-1";
    config.connectTimeoutMs = 3000;
    config.requestTimeoutMs = 60000;
    auto s3Client = Aws::MakeShared<Aws::S3Client>(ALLOCATION_TAG, config, false);

   // Aws::S3::S3Client s3Client(config);
    auto sdk_client_executor = Aws::MakeShared<Aws::Utils::Threading::DefaultExecutor>(ALLOCATION_TAG);
    Aws::Transfer::TransferManagerConfiguration transferConfig(sdk_client_executor.get());
    transferConfig.s3Client = s3Client;


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

    static std::shared_ptr<Aws::Transfer::TransferManager> transferManager = Aws::Transfer::TransferManager::Create(transferConfig);

    Aws::String fileToUpload = "MyFile.data";
std::shared_ptr<Aws::Transfer::TransferHandle> transferHandle = transferManager->UploadFile(fileToUpload.c_str(), bucket.c_str(), fileToUpload.c_str(),
    "multipart/form-data", Aws::Map<Aws::String, Aws::String>());

    size_t retries = 0;
    transferHandle->WaitUntilFinished();
    while (transferHandle->GetStatus() == Aws::Transfer::TransferStatus::FAILED && retries++ < 5)
    {
        transferManager->RetryUpload(fileToUpload.c_str(), transferHandle);
        transferHandle->WaitUntilFinished();
    }
    transferHandle->SetIsMultipart(true);

    Aws::Transfer::PartStateMap completedParts = transferHandle->GetCompletedParts();
    string eTagList;

    for (const auto &p : completedParts)
    {
        std::cout << "completedparts[" << p.first << "]" << p.second->GetETag() << '\n';
    }

    Aws::Transfer::TransferStatus status = transferHandle->GetStatus();
    std::string res("Result:");
    res.append(std::to_string((int)status));

    std::cout << res.c_str() << std::endl;

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

此代码不起作用。

error:no matching function for call to ‘Aws::S3::S3Client::S3Client(Aws::Client::ClientConfiguration&, bool)’

error in line: auto s3Client = Aws::MakeShared<Aws::S3Client>(ALLOCATION_TAG, config, false);

标签: amazon-web-servicesamazon-s3aws-sdkaws-sdk-cpp

解决方案


使用传输管理器

并查看测试以了解示例用法。


推荐阅读