将uint8_t *缓冲区上传到AWS S3,无需通过文件系统

时间:2018-02-07 14:43:19

标签: c++ amazon-web-services amazon-s3

免责声明: 我不是c ++程序员,请救我自己。

我尝试使用AWS SDK在c ++中创建PutObjectRequest。

我有一个&utt8_t *' (在Java-land从哪里我称之为字节[],我相信行星c ++这是一个缓冲区),我需要以某种方式将它变成Aws :: IOStream。

所有示例都显示直接来自文件系统的数据。

我已经看到了几个类似的问题(但不是真的),答案指向另一个名为Boost的第三方库,但肯定这是一个常见的用例?为什么我需要第三方库来执行可能使用AWS开发工具包的事情?:

"我有数据,我想把它放在S3上。不,它不在文件系统中,是的我在内存中创建它。"

uint8_t* buf; //<-- How do I get this...
...
Aws::S3::Model::PutObjectRequest object_request;
object_request.WithBucket(output_bucket).WithKey(key_name);

object_request.SetBody(data); //<-- ...into here

我非常感谢这里的任何帮助或指示(没有双关语)。

更新
我已经在评论中尝试了所有内容,并且:

std::shared_ptr<Aws::IOStream> objectStream = Aws::MakeShared<Aws::StringStream>("PutObjectInputStream");        
*objectStream << data;
objectStream->flush();
object_request.SetBody(objectStream);

和此:

std::shared_ptr<Aws::IOStream> objectStream = Aws::MakeShared<Aws::StringStream>("PutObjectInputStream");        
std::istringstream is((char*) data);
*objectStream << is.rdbuf();
objectStream->flush();
object_request.SetBody(objectStream);

编译,但每个只上传2个字节的数据。

我尝试编译的其他东西是:

auto input_data = Aws::MakeShared<Aws::IOStream>("PutObjectInputStream", std::istringstream((char*) data), std::ios_base::in | std::ios_base::binary);
object_request.SetBody(input_data);

object_request.SetBody(std::make_shared<std::istringstream>( std::istringstream( (char*) spn ) ));

这些在S3上创建对象,但是有0个字节:

    std::shared_ptr<Aws::IOStream> objectStream = Aws::MakeShared<Aws::StringStream>("PutObjectInputStream");
    objectStream->rdbuf()->pubsetbuf(static_cast<char*>(reinterpret_cast<char*>(data)), length);
    objectStream->rdbuf()->pubseekpos(length);
    objectStream->seekg(0);
    object_request.SetBody(objectStream);


    std::shared_ptr<Aws::IOStream> objectStream = Aws::MakeShared<Aws::StringStream>("PutObjectInputStream");
    objectStream->rdbuf()->pubsetbuf(reinterpret_cast<char*>(data), length);
    objectStream->rdbuf()->pubseekpos(length);
    objectStream->seekg(0);
    object_request.SetBody(objectStream);

1 个答案:

答案 0 :(得分:6)

小时的黑客行为之后,答案是:

    Aws::S3::Model::PutObjectRequest object_request;
    object_request.WithBucket(output_bucket).WithKey(key_name);
    auto data = Aws::MakeShared<Aws::StringStream>("PutObjectInputStream", std::stringstream::in | std::stringstream::out | std::stringstream::binary);
    data->write(reinterpret_cast<char*>(buffer), length);
    object_request.SetBody(data);

感谢Ben Voigt指出当您make_shared(或我的情况为MakeShared)时,您实际上并未实际传递数据。您只是告诉您T您正在分享的内容。

nbubis&#39;回答这个问题:const char * to std::basic_iostream