【发布时间】:2018-02-07 14:43:19
【问题描述】:
免责声明: 我不是 C++ 程序员,请救救我。
我正在尝试使用 AWS 开发工具包在 c++ 中创建一个 PutObjectRequest。
我有一个 'uint8_t*'(在 Java 领域中,我称其为字节 [],我相信在 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
我非常感谢这里的任何帮助或指示(不是双关语)。
更新
我已经尝试了 cmets 中的所有内容,并且:
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);
【问题讨论】:
-
请提供
SetBody方法的参考。 First link in google 不包含它。 -
它在 AWS 开发工具包文档中,就在这里:sdk.amazonaws.com/cpp/api/0.12.9/dd/dd8/… 抱歉,我想我已经明确表示这是一个 AWS S3 PutObjectRequest。
-
看来你可以使用
object_request.SetBody( std::istringstream( (char*) data ) );之类的东西,但我无法自己测试,也不确定这是最好的解决方案。 -
感谢您的检查。不幸的是它没有编译:
error: no viable conversion from 'std::istringstream' (aka 'basic_istringstream<char>') to 'const std::shared_ptr<Aws::IOStream>' (aka 'const shared_ptr<basic_iostream<char, std::char_traits<char> > >') -
@ndtreviv: 不,
make_shared<T>不采用T类型的参数,但需要创建T(T的构造函数的参数)。
标签: c++ amazon-web-services amazon-s3