Node.js v6.11环境下如何从URL获取图片数据为Buffer?
在Node.js v6.11中用request模块获取图片Buffer的解决方案
嘿,太懂你维护老Node.js项目的痛苦了——高版本的fetch、axios这些好用的模块没法用,只能抱着request模块啃对吧?我之前在维护v6.x的项目时也碰到过一模一样的问题,给你分享两种靠谱的解决方式:
方法一:直接通过request回调获取Buffer
核心是设置encoding: null,这样request就不会把响应体转成字符串,直接返回原始的Buffer对象:
const request = require('request'); const fs = require('fs'); const imageURL = '你的目标图片地址'; request({ url: imageURL, encoding: null }, (err, res, body) => { if (err) { console.error('请求图片失败:', err); return; } // body 就是你要的图片Buffer! console.log('获取到图片Buffer,大小:', body.length + '字节'); // 如果需要保存到文件,直接写Buffer就行,不用指定'binary'编码 fs.writeFile('downloaded-img.jpg', body, (writeErr) => { if (writeErr) throw writeErr; console.log('图片已保存'); }); });
你之前尝试的第二个写法没拿到正确Buffer,大概率是因为没设置encoding: null——默认情况下request会把响应体转成UTF-8字符串,这样存成图片肯定会损坏。
方法二:通过流式方式收集Buffer(适合大图片)
如果图片比较大,一次性加载到内存可能有压力,用stream分块收集再拼接成Buffer更稳妥:
const request = require('request'); const fs = require('fs'); const imageURL = '你的目标图片地址'; const chunkList = []; request(imageURL) .on('data', (chunk) => { chunkList.push(chunk); // 收集每个数据块 }) .on('end', () => { const imageBuffer = Buffer.concat(chunkList); // 拼接所有块成完整Buffer console.log('流式获取Buffer完成,大小:', imageBuffer.length + '字节'); fs.writeFile('downloaded-img-stream.jpg', imageBuffer, (writeErr) => { if (writeErr) throw writeErr; console.log('流式下载的图片已保存'); }); }) .on('error', (err) => { console.error('流式请求出错:', err); });
关键注意事项
一定要安装兼容Node.js v6.11的request版本,最新版request已经不支持v6了,所以安装时指定版本:
npm install request@2.88.2
这个版本是经过验证可以在v6.11上稳定运行的。
内容的提问来源于stack exchange,提问作者Ihab
相关产品推荐
相关产品推荐

