You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 00:12:00