You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

编译AWS-SDK-CPP的S3上传示例代码时遇类型转换编译错误

AWS C++ SDK S3 PutObject编译错误修复

问题重现

编译S3上传文件代码时出现以下错误:

In function ‘aws::lambda_runtime::invocation_response putFileObject(Aws::S3::S3Client&, const String&, const String&)’:
error: cannot convert ‘std::shared_ptrstd::basic_fstream’ to ‘const std::shared_ptrstd::basic_iostream&’

错误原因

PutObjectRequest::SetBody要求传入std::shared_ptr<Aws::IOStream>类型的参数,而你使用Aws::MakeShared<Aws::FStream>创建的是std::shared_ptr<Aws::FStream>。虽然FStream继承自IOStream,但C++智能指针的协变转换无法自动完成,必须显式处理。

解决方案

方案1:显式转换智能指针类型

在调用SetBody时,用std::static_pointer_cast将FStream的智能指针转换为IOStream类型:

request.SetBody(std::static_pointer_cast<Aws::IOStream>(inputData));

方案2:直接创建IOStream类型的智能指针

将MakeShared的模板参数改为Aws::IOStream,直接生成符合要求的智能指针:

auto inputData = Aws::MakeShared<Aws::IOStream>("SampleAllocationTag",
                                              fileName.c_str(),
                                              std::ios_base::in | std::ios_base::binary);

方案3:使用SDK专用的文件读取流(推荐)

AWS SDK提供了Aws::FileReadStream类,专门用于读取文件,它直接继承自IOStream,可以直接传递给SetBody,代码更简洁:

auto inputData = Aws::MakeShared<Aws::FileReadStream>("SampleAllocationTag", fileName.c_str());

修改后的完整代码

以方案3为例,修改后的代码如下:

invocation_response putFileObject(Aws::S3::S3Client &client, const Aws::String& bucketName, const Aws::String& objectName) {
    const std::string fileName = "/tmp/test";
    auto inputData = Aws::MakeShared<Aws::FileReadStream>("SampleAllocationTag", fileName.c_str());

    Aws::S3::Model::PutObjectRequest request;
    request.SetBucket(bucketName);
    request.SetKey(objectName);
    request.SetBody(inputData);

    Aws::S3::Model::PutObjectOutcome outcome = client.PutObject(request);
    if (!outcome.IsSuccess()) {
        std::cout << "Failure Putting Object" << std::endl;
        return aws::lambda_runtime::invocation_response::failure("Error Putobject", "application/json");
    }
    else {
        std::cout << "Success Putting Object" << std::endl;
        return aws::lambda_runtime::invocation_response::success("Success Putobject", "application/json");
    }
} 

内容的提问来源于stack exchange,提问作者Karan Parikh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 16:40:40