我需要从其他服务器获取一些图像到我的服务器。我使用superagent发送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 ... >
答案 0 :(得分:1)
在文档中搜索后,我找到了writable.write(chunk[, encoding][, callback])
方法来处理这个问题:
function getPhotos(array) {
array.forEach(item => {
request // superagent
.get(url)
.query({media_id: item})
.end((err, res) => {
let writeStream = fs.createWriteStream(path.join(pathname, title));
writeStream.write(res.body);
})
})
}
完成!它很棒。
答案 1 :(得分:1)
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()
来限制并发下载'任务'的数量。