下载和上传图像而不保存到磁盘

时间:2018-08-07 10:16:37

标签: javascript node.js image-uploading fs

我正在使用Node.js,尝试从URL获取图像并将该图像上传到另一个服务,而不将图像保存到磁盘。将文件保存到磁盘并使用fs创建可读流时,下面的代码可以工作。但是,当我在只读文件系统(webtask.io)上作为cron作业执行此操作时,我希望在不将文件临时保存到磁盘的情况下达到相同的结果。那不可能吗?

  request(image.Url)
  .pipe(
    fs
      .createWriteStream(image.Id)
      .on('finish', () => {
        client.assets
          .upload('image', fs.createReadStream(image.Id))
          .then(imageAsset => {
            resolve(imageAsset)
          })
      })
    )

您对不保存文件到磁盘的方法有何建议?上传客户端将使用以下

client.asset.upload(type: 'file' | image', body: File | Blob | Buffer | NodeStream, options = {}): Promise<AssetDocument>

谢谢!

2 个答案:

答案 0 :(得分:0)

如何将缓冲区传递给上传功能?由于按照您的声明,它将接受缓冲区。

作为旁注...这将在方法执行期间将其保留在内存中,因此,如果多次调用此方法,则可能会耗尽资源。

request.get(url, function (res) {
      var data = [];

    res.on('data', function(chunk) {
        data.push(chunk);
    }).on('end', function() {
        var buffer = Buffer.concat(data);
        // Pass the buffer
        client.asset.upload(type: 'buffer', body: buffer);
    });
});

答案 1 :(得分:0)

我尝试了一些各种库,结果发现node-fetch提供了一种返回缓冲区的方法。因此,此代码有效:

  fetch(image.Url)
    .then(res => res.buffer())
    .then(buffer => client.assets
      .upload('image', buffer, {filename: image.Id}))
      .then(imageAsset => {
        resolve(imageAsset)
    })