使用boost::beast处理大HTTP响应如何直接写文件避免内存占用过高
Boost.Beast大文件响应直接写入磁盘实现方案
Boost.Beast原生提供了和Objective-C中NSURLSessionDownloadTask等价的实现,无需自行实现流式写入逻辑,核心通过boost::beast::http::file_body替换你当前使用的dynamic_body,即可实现边接收响应边写入磁盘,不会将全量响应内容加载到内存,完美适配大容量二进制文件下载场景。
实现代码参考如下:
#include <fstream> #include <boost/beast.hpp> #include <boost/asio.hpp> namespace beast = boost::beast; namespace http = beast::http; namespace net = boost::asio; using tcp = net::ip::tcp; // 假设你已经完成TCP连接、HTTP请求发送的前置逻辑 beast::tcp_stream stream_; // 1. 构造使用file_body的响应对象,打开目标写入文件(注意二进制模式) http::response<http::file_body> res; beast::error_code ec; res.body().open( "target_file.bin", std::ios_base::out | std::ios_base::binary | std::ios_base::trunc, ec ); // 可在此处判断ec处理文件打开失败的异常逻辑 // 2. 读取响应,仅用小体积buffer存储响应头,响应体自动写入文件 beast::flat_buffer header_buf; // 仅缓存响应头,内存占用可忽略 http::read(stream_, header_buf, res, ec); // 响应读取完成后,file_body的析构函数会自动关闭文件
补充说明:
- 代码中的
header_buf仅用来存储体积极小的HTTP响应头,不会存储任何响应体内容,内存占用不会随下载文件体积增大而上涨 - 如果需要实现下载进度回调、断点续传等进阶能力,可以调用
http::read_some逐块读取响应体自行写入文件,灵活度更高
内容的提问来源于stack exchange,提问作者Zohar81
相关产品推荐
相关产品推荐

