数据库触发firebase函数从URL下载图像并将其保存到存储器

数据库触发firebase函数从URL下载图像并将其保存到存储器,firebase,firebase-storage,google-cloud-functions,Firebase,Firebase Storage,Google Cloud Functions,当我的数据库更新为“photo_url”字段时,我想下载图像并将其保存到存储器中 exports.saveToStorage = functions.database.ref(`/images/${itemImageRef}`) .onWrite(event => { const filePath = event.data.val(); const filename = filePath.split('/').pop(); var download = request.get

当我的数据库更新为“photo_url”字段时,我想下载图像并将其保存到存储器中

exports.saveToStorage = functions.database.ref(`/images/${itemImageRef}`)
.onWrite(event => {
  const filePath = event.data.val();
  const filename = filePath.split('/').pop();

  var download = request.get(filePath).on('error', (err) => {
    console.log(err)
  })
  .pipe(fs.createWriteStream(filename));

  download.on('finish', () => {
    const bucket = gcs.bucket('id.appspot.com');
    const storagePath = `images/${filename}`;

    return bucket.upload(download, { destination: storagePath })
    .then(() => {
      console.log('success upload');
    });
  });
});
它记录“Error:EROFS:read-only filesystem,在出错时打开'image.jpg'(本机)。”我想我无法检索createWriteStream保存的文件?
那么我应该如何从网上下载图片呢

有了@jobsuel推荐的帖子,代码现在可以工作了:

exports.saveToStorage = functions.database.ref(`/images/${itemImageRef}`)
.onWrite(event => {

  const filePath = event.data.val();
  const filename = filePath.split('/').pop();

  const bucket = gcs.bucket('id.appspot.com');
  const remoteWriteStream = bucket.file(filename).createWriteStream({
    metadata: { contentType: 'image/jpeg' }
  });

  request(filePath).pipe(remoteWriteStream)
  .on('error', (err) => console.log(err))
  .on('finish', () => console.log('success save image'));

});

通过将请求结果直接传输到bucket,它通过跳过写入本地文件的步骤来解决问题,我怀疑这就是我的原始代码失败的原因。另外,别忘了为图像设置contentType。

也许这会对您有所帮助:谢谢,但我已经升级了我的计划,以便它能够发出外部请求。@Jobsamuel,我忽略了解决方案,代码很有帮助,我现在可以将数据通过管道传输到Firebase存储,这跳过了以我原来的方法使用fs“本地”存储文件的步骤。Firebase函数现在可以将文件保存到存储器中,但它仍然无法识别它是图像。也许我必须更改元数据内容类型中的设置。