aws s3 上传 binary 数据 (通过stringstream)
有个需求需要将二进制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::read
和std::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的封装代码,仅供参考。