如何从其他服务器获取映像到我的Express服务器并写入磁盘

我需要从另一台服务器获取一些图像到我的服务器。 我用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 ... > 

Superagent支持stream ,这意味着您可以将请求的响应直接传输到文件(无需首先将响应完全读入内存)。

例如,下面是一个(未经testing的)函数示例,一旦下载了所有文件,就会调用一个提供的callback函数(通过观察每个文件的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); }) } 

关于这个例子的一些说明

  • 代码不检查任何错误;
  • 所有文件同时下载,这取决于arrays的大小,可能会造成问题; 如果这不是你想要的,你可以例如使用async.eachLimit()来限制并发下载“任务”的数量。

在文档中search后,我find了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); }) }) } 

完成! 它工作很好。