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

Node.js 如何将图像从另一台服务器获取到我的Express服务器并写入磁盘,node.js,express,fs,Node.js,Express,Fs,我需要从另一台服务器获取一些图像到我的服务器。我使用superagent发送GET请求。我得到了响应,但如何使用fs.createWriteStream将文件写入磁盘?我想看结束活动 我正在使用Express 4和Node.js 5.3.0 function getPhotos(array) { array.forEach(item => { request // superagent .get(url) .query

我需要从另一台服务器获取一些图像到我的服务器。我使用superagent发送GET请求。我得到了响应,但如何使用fs.createWriteStream将文件写入磁盘?我想看
结束
活动

我正在使用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 ... >

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

完成了!它工作得很好。

在文档中搜索后,我找到了
可写的.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支持,这意味着您可以将请求的响应直接流式传输到文件(无需首先将响应完全读取到内存中)

例如,这里有一个(未测试的)函数示例,它将在下载所有文件后调用提供的回调(通过观察每个文件的
finish
事件,计算已写入的文件数,并将其与数组中的文件总数进行比较):

关于这个例子的一些注释

  • 代码没有任何错误检查
  • 所有文件同时下载,这取决于阵列的大小,可能会引起问题;如果这不是您想要的,例如,您可以使用来限制并发下载“任务”的数量
    • Superagent支持,这意味着您可以将请求的响应直接流式传输到文件(无需先将响应完全读取到内存中)

      例如,这里有一个(未测试的)函数示例,它将在下载所有文件后调用提供的回调(通过观察每个文件的
      finish
      事件,计算已写入的文件数,并将其与数组中的文件总数进行比较):

      关于这个例子的一些注释

      • 代码没有任何错误检查
      • 所有文件同时下载,这取决于阵列的大小,可能会引起问题;如果这不是您想要的,例如,您可以使用来限制并发下载“任务”的数量

      @robertklep-ha!编辑。感谢将响应(记录在案并在穆罕默德的回答中提到)传输似乎更可取,因为它不需要首先将整个响应加载到内存中。@robertklep谢谢。这就是我想要的。你能给我一个答案吗?我希望您能展示一些代码,包括如何使用
      finish
      事件?我会接受你的回答。
      finish
      事件完全不需要观看,除非你有一些特定的要求(例如,等待所有照片下载后再继续),你可能需要将这些要求添加到你的问题中:-)@robertklep ha!编辑。感谢将响应(记录在案并在穆罕默德的回答中提到)传输似乎更可取,因为它不需要首先将整个响应加载到内存中。@robertklep谢谢。这就是我想要的。你能给我一个答案吗?我希望您能展示一些代码,包括如何使用
      finish
      事件?我会接受你的回答。
      finish
      事件严格来说不需要观看,除非你有一些特定的要求(例如,等待所有照片下载后再继续),你可能应该在你的问题中添加这些要求:-)@BrickYang在这种情况下,您可能无法使用流媒体,必须先将每个响应读入内存(很像您自己的答案)。不过,
      finish
      事件处理仍然可用。抱歉,我错过了一些内容。
      fs.createWriteStream(path.join(pathname,title))
      中的
      title
      取决于superagent请求的响应值,因此我认为我必须将
      管道
      放在
      请求
      结束
      方法内部。我发现流媒体并不像你说的那样工作正如您提到的错误检查,我可以为
      writeStream.write()
      方法使用
      try catch
      吗?@BrickYang不,您需要为此处理事件。@BrickYang在这种情况下,您可能无法使用流式处理,必须先将每个响应读取到内存中(很像您自己的答案)。不过,
      finish
      事件处理仍然可用。抱歉,我错过了一些内容。
      fs.createWriteStream(path.join(pathname,title))
      中的
      title
      取决于superagent请求的响应值,因此我认为我必须将
      管道
      放在
      请求
      结束
      方法内部。我发现流媒体并不像你说的那样工作正如您提到的错误检查,我可以为
      writeStream.write()
      方法使用
      try catch
      吗?@BrickYang否,您需要为此处理事件。