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

Send image in http post via json object using cpprest

本文关键字:post 图像 http cpprest 通过 json 对象 使用      更新时间:2023-10-16

我正在使用库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 对象以在我的帖子中发送?

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

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

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

SO上也有关于如何在JS中解码Base64的问题:如何使用HTTP POST在JSON中将图像作为base64字符串发送?

附言 谈到示例代码,您可以先将数据加载到 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