从使用 Cloud Functions for Firebase 上传的文件中获取下载 URL

新手上路,请多包涵

使用 Firebase 功能在 Firebase 存储中上传文件后,我想获取文件的下载 url。

我有这个 :

 ...

return bucket
    .upload(fromFilePath, {destination: toFilePath})
    .then((err, file) => {

        // Get the download url of file

    });

目标文件有很多参数。甚至一个名为 mediaLink 。但是,如果我尝试访问此链接,则会收到此错误:

匿名用户没有 storage.objects.get 访问对象…

有人可以告诉我如何获取公共下载网址吗?

谢谢

原文由 Valentin 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 366
2 个回答

您需要通过 @google-cloud/storage NPM 模块使用 getSignedURL 生成签名 URL。

例子:

 const gcs = require('@google-cloud/storage')({keyFilename: 'service-account.json'});
// ...
const bucket = gcs.bucket(bucket);
const file = bucket.file(fileName);
return file.getSignedUrl({
  action: 'read',
  expires: '03-09-2491'
}).then(signedUrls => {
  // signedUrls[0] contains the file's public URL
});

您需要使用 您的服务帐户凭据 初始化 @google-cloud/storage ,因为应用程序默认凭据是不够的。

更新:现在可以通过 Firebase Admin SDK 访问 Cloud Storage SDK,它 充当 @google-cloud/storage 的包装器。唯一的方法是,如果您:

  1. 使用特殊服务帐户初始化 SDK,通常通过第二个非默认实例。
  2. 或者,在没有服务帐户的情况下,通过向默认 App Engine 服务帐户授予“signBlob”权限。

原文由 James Daniels 发布,翻译遵循 CC BY-SA 4.0 许可协议

使用 file.publicUrl()

异步/等待

const bucket = storage.bucket('bucket-name');
const uploadResponse = await bucket.upload('image-name.jpg');
const downloadUrl = uploadResponse[0].publicUrl();

打回来

const bucket = storage.bucket('bucket-name');
bucket.upload('image-name.jpg', (err, file) => {
  if(!file) {
    throw err;
  }

  const downloadUrl = file.publicUrl();
})

downloadUrl 将是 "https://storage.googleapis.com/bucket-name/image-name.jpg"

请注意,为了使上述代码正常工作,您必须公开存储桶或文件。为此,请按照 https://cloud.google.com/storage/docs/access-control/making-data-public 此处的说明进行操作。另外,我直接导入了 @google-cloud/storage 包,而不是通过 Firebase SDK。

原文由 goodonion 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题