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

Posted j1ac

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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::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的封装代码,仅供参考。 

以上是关于aws s3 上传 binary 数据 (通过stringstream)的主要内容,如果未能解决你的问题,请参考以下文章

使用 AWS c++ 接口将文件上传到 s3 时,Content-Type 标签不正确

使用 AWS c++ 接口将文件上传到 s3 时,Content-Type 标签不正确

通过使用 AWS-SDK PHP 生成的预签名帖子拒绝 AWS S3 上传访问

通过使用 AWS-SDK PHP 生成的预签名帖子拒绝 AWS S3 上传访问

我如何通过AWS SNS设置有关上传事件的AWS S3?

Linux服务器通过aws命令行上传文件至S3