使用cpprestsdk接收HTTP请求BMP图片时多余头部致文件损坏如何解决
解决方案
问题原因
你目前的写法是直接将整个multipart/form-data格式的请求体全量写入文件,这类格式自带的边界标识、文件字段头部信息会被一同写入,不属于bmp文件本身的内容,所以导致图片损坏。
推荐处理方案
cpprestsdk本身内置了multipart/form-data的解析能力,不需要手动切割内容,直接调用内置接口提取文件字段即可:
#include <cpprest/http_msg.h> #include <cpprest/filestream.h> using namespace web; using namespace web::http; using namespace Concurrency::streams; void Service::handlePost(http_request request) { // 异步解析multipart表单 request.extract_multipart().then([=](std::vector<http::multipart::part> parts) { // 遍历表单字段找到name为image的文件字段 for (const auto& part : parts) { auto disp = part.headers().content_disposition(); if (disp.is_valid() && disp.name() == U("image")) { utility::string_t file_path = U("file.bmp"); // 打开文件输出流 return fstream::open_ostream(file_path).then([=](ostream out_stream) { // 直接将文件字段的内容写入流,仅包含纯bmp二进制数据 return part.body().read_to_end(out_stream.streambuf()).then([=](size_t bytes_written) { out_stream.close(); // 后续返回请求响应逻辑 request.reply(status_codes::OK, U("文件保存成功")); }); }); } } // 未找到对应字段返回错误 request.reply(status_codes::BadRequest, U("缺少image文件字段")); }).wait(); // 仅示例用,生产环境建议优化异步逻辑避免阻塞 }
注意事项
- 上述写法会自动过滤form-data的边界、字段头部等冗余内容,提取到的
part.body()就是纯图片二进制数据 - 你原代码中
make_sharde为拼写错误,正确写法是std::make_shared,上述示例中直接使用内置异步流写法无需手动管理共享指针 - 如果你使用的cpprestsdk版本过低没有内置multipart解析能力,才需要手动读取请求体后根据边界字符串切割内容,过滤头部后再写入文件
内容的提问来源于stack exchange,提问作者kornel kornel
相关产品推荐
相关产品推荐

