如何从另一台服务器获取图像到我的 Express 服务器并写入磁盘

How to get images from another server to my Express server and write to disk

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

在文档中搜索后,我找到了 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);
            })
    })
}

完成!效果很好。

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() 来限制并发下载的数量 'tasks'.