ndt*_*viv 5 c++ amazon-s3 amazon-web-services
免责声明: 我不是c ++程序员,请自救我.
我正在尝试使用AWS SDK在c ++中创建一个PutObjectRequest.
我有一个'uint8_t*'(在Java-land中我称之为字节[],我相信行星c ++这是一个缓冲区),我需要以某种方式将它变成Aws :: IOStream.
所有示例都显示了直接来自文件系统的数据.
我已经看到了几个类似的问题(但不是真的),答案指向另一个名为Boost的第三方库,但这肯定是一个常见的用例?为什么我需要第三方库来执行可能使用AWS SDK的事情?:
"我有数据,我想把它放在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
Run Code Online (Sandbox Code Playgroud)
我非常感谢这里的任何帮助或指示(没有双关语).
更新
我在评论中尝试了所有内容,并且:
std::shared_ptr<Aws::IOStream> objectStream = Aws::MakeShared<Aws::StringStream>("PutObjectInputStream");
*objectStream << data;
objectStream->flush();
object_request.SetBody(objectStream);
Run Code Online (Sandbox Code Playgroud)
还有这个:
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);
Run Code Online (Sandbox Code Playgroud)
哪个编译,但每个只上传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);
Run Code Online (Sandbox Code Playgroud)
和
object_request.SetBody(std::make_shared<std::istringstream>( std::istringstream( (char*) spn ) ));
Run Code Online (Sandbox Code Playgroud)
这些在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);
Run Code Online (Sandbox Code Playgroud)
经过几个小时的黑客攻击,这就是答案:
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);
Run Code Online (Sandbox Code Playgroud)
感谢Ben Voigt指出当你make_shared(或MakeShared在我的情况下),你实际上并没有在那时传递数据.你只是告诉它T你正在分享什么.
nbubis回答这个问题也有帮助:const char*to std :: basic_iostream