aws s3 上传 binary 数据 (通过stringstream)

kaylin0 2020-01-17

有个需求需要将二进制istream上传到s3上暂存,但苦于没能直接找到接口,官方提供的设置数据块的接口如下:

inline void SetBody(const std::shared_ptr<Aws::IOStream>& body) { m_bodyStream = body; }
这个Aws::IOStream其实就是std::iostream的封装。
在实际寻找传入参数的时候没找到比较好的传入对象:fstream意味着我需要先将数据存到磁盘再去读取,感觉不是很好;而stringstream在装二进制数据的时候又可能出现截断的可能性。
最后我终于找到了https://www.ojit.com/article/829511这个解释,原来stringstream本身是可以存二进制数据流的,只不过这时候不能使用<<>>函数,需要使用std::stringstream::readstd::stringstream::write函数。
与此同时,从aws sdk的注解中我发现这个接口传入的数据aws都会当做二进制数据格式:binary/octet-stream 进行读取。这样的话,往s3上面写二进制流就没什么问题了。
大致代码如下:
std::shared_ptr<Aws::StringStream> input_data =
        Aws::MakeShared<Aws::StringStream>("");

    input_data->write(buffer.data(),srcSize);
    S3ClientWrapper *client = new S3ClientWrapper();
    std::string endpoint = "";
    ngmp::common::aws_client_configuration_info_struct config;
    client->Init(config);
    std::string errinfo;
    Aws::S3::S3Errors error_code;
    
    bool res = client->PutObject("bucket","object-name",input_data,errinfo, error_code,10);

 上面的代码包含了一部分aws sdk的封装代码,仅供参考。