使用cpprest通过json对象在http post中发送图像

时间:2015-04-16 15:00:38

标签: c++ json

我正在使用图书馆cpprest。我试图将图像文件作为二进制文件发送到端点。我需要它遵循

的json结构
{
    "image": "binaryfile",
    "type": "file"
}

但是,我不知道如何做到这一点,只有接收二进制数据的好例子。所以这就是我到目前为止所做的:

ifstream imageToConvert;

imageToConvert.open("path to file", ios::binary);

ostringstream ostrm;


if (imageToConvert.is_open())
{
    ostrm << imageToConvert.rdbuf();
    imageToConvert.close();
}
imageToConvert.close();

//build json string to convert
string MY_JSON = ("{\"image\" : \"");
MY_JSON += (ostrm.str());
MY_JSON += ("\",\"type\" : \"file\"}");

//set up json object
json::value obj;
obj.parse(utility::conversions::to_string_t(MY_JSON));

然而,这会引发内存故障异常。所以我的问题是,从文件中获取这些二进制数据的最佳方法是什么,以及如何在我的帖子中正确构建我的json对象以进行发送?

1 个答案:

答案 0 :(得分:2)

转换为ostringstream以及稍后将字符串连接到MY_JSON会产生错误,因为很可能您的二进制图像数据包含一些不可打印的字符。

我认为您应该将二进制数据从ifstream编码为base64字符串,并将该编码字符串传递给MY_JSON。在服务器端使用base64-decoding解码image字段中的数据。

可以在此处找到C ++的基本Base64编码/解码: http://www.adp-gmbh.ch/cpp/common/base64.html

关于如何在JS中解码Base64还有一些问题:How to send image as base64 string in JSON using HTTP POST?

P.S。谈论示例代码,您可以先将数据加载到std::vector

std::ifstream InFile( FileName, std::ifstream::binary );
std::vector<char> data( ( std::istreambuf_iterator<char>( InFile ) ), std::istreambuf_iterator<char>() );

然后你打电话给

std::string base64_encode(unsigned char const* bytes_to_encode, unsigned int in_len);
像这样:

std::string Code = base64_encode((unsigned char*)&data[0], (unsigned int)data.size());

最后,将Code添加到JSON:

MY_JSON += Code;   // instead of ostrm.str