Node.js使用axios下载URL视频并存为二进制变量的问题咨询
问题根因
你当前代码无法拿到二进制内容的核心原因:
- 配置
responseType: 'stream'时,videoResponse.data返回的是Node.js可读流(Readable Stream)实例,直接await该实例不会自动拼接流内的二进制数据,因此拿到的是流对象而非目标二进制内容。 - 若调用
pipe方法提示不存在,通常是axios版本兼容问题,或未正确取到流实例本身。
可用方案
方案1:直接获取二进制Buffer(无流处理需求优先选)
如果不需要边下载边做流处理(比如进度监听、实时转码),完全没必要使用stream响应类型,直接将responseType设为arraybuffer即可,axios会自动将响应内容组装为二进制格式,代码最简:
const videoResponse = await axios({ method: 'GET', url: url, responseType: 'arraybuffer', }); // video即为完整的视频二进制Buffer对象,可直接存入变量使用 const video = Buffer.from(videoResponse.data);
方案2:必须使用stream响应时,手动拼接流数据
如果确实需要使用stream模式,不能直接await流对象,需要手动监听流事件收集所有数据块,最终拼接为完整二进制:
const videoResponse = await axios({ method: 'GET', url: url, responseType: 'stream', }); const readableStream = videoResponse.data; const chunks = []; readableStream.on('data', (chunk) => { chunks.push(chunk); }); const video = await new Promise((resolve, reject) => { readableStream.on('end', () => { // 拼接所有数据块为完整二进制Buffer resolve(Buffer.concat(chunks)); }); readableStream.on('error', reject); });
提示:如果下载的视频体积较大(单文件超过500MB),不建议将完整二进制内容存在内存变量中,会占用大量进程内存,优先使用
pipe方法将流直接写入本地文件,降低内存开销。
内容的提问来源于stack exchange,提问作者Mr.Grease
相关产品推荐
相关产品推荐

