我需要从另一台服务器获取一些图像到我的服务器。我使用超级代理发送GET请求。我得到了响应,但是如何使用fs.createWriteStream将文件写入磁盘?我想观看finish
事件。
我正在使用Express 4和Node.js 5.3.0
function getPhotos(array) {
array.forEach(item => {
request // superagent
.get(url)
.query({media_id: item})
.end((err, res) => {
console.log(res.status);
console.log(res.body);
})
})
}
res.body
是缓冲区:<Buffer ff d8 ff e0 00 10 4a 46 49 46 00 01 01 00 00 48 00 48 00 00 ff e1 00 58 45 78 69 66 00 00 4d 4d 00 2a 00 00 00 08 00 02 01 12 00 03 00 00 00 01 00 01 ... >
最佳答案
Superagent支持streams,这意味着您可以将请求的响应直接流式传输到文件(无需先将响应完全读取到内存中)。
例如,这是您的函数的一个(未经测试的)示例,该示例将在下载完所有文件后调用提供的回调(通过监视每个文件的finish
事件,计算已写入的文件数并进行比较)到数组中文件的总数):
function getPhotos(array, callback) {
var numFiles = array.length;
var numFinished = 0;
array.forEach(item => {
var file = fs.createWriteStream(path.join(pathname, title)).on('finish', () => {
if (++numFinished === numFiles) {
return callback();
}
});
request.get(url).query({media_id: item}).pipe(file);
})
}
有关此示例的一些注意事项
该代码不会进行任何错误检查;
同时下载所有文件,这取决于阵列的大小,可能会引起问题;如果这不是您想要的,则可以使用
async.eachLimit()
限制并发下载“任务”的数量。关于node.js - 如何将图像从另一台服务器获取到我的Express服务器并写入磁盘,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34451980/