带有node.js的Firebase存储/存储桶公共上传

时间:2017-05-31 06:34:04

标签: firebase google-cloud-storage firebase-storage

代码:

"core-js": "^2.4.1",

我的文件已成功上传到我的firebase存储,但是:

  1. 现在可以通过网址公开访问该文件: https://storage.googleapis.com/project-id.appspot.com/uploads/12345/full.jpg。我可以在我的应用程序中使用此固定URL,或者可能会更改或过期吗?
  2. var storage = require('@google-cloud/storage'); var gcs = storage({ projectId: config.google.projectId, keyFilename: config.google.keyFilenameFirebase }); var bucket = gcs.bucket('project-id.appspot.com'); var destination = 'uploads/12345/full.jpg'; bucket.upload(myFile, { public: true, destination: destination }, function(err, file) { if (err) { console.log(err); } }); 似乎打破了Firebase存储UI:
  3. enter image description here 未显示右侧图像的预览,我无法通过下载按钮下载图像。此外,没有下载网址(我不介意,因为我可以通过上面的链接访问它)和点击“创建新的下载网址”Firebase收益

      

    生成下载网址时出错

    删除public: true时,预览显示正确,我也可以生成下载网址。但公共网址https://storage.googleapis.com/project-id.appspot.com/uploads/12345/full.jpg将不再适用,这对我来说是必要的。

    所以我的计划是坚持public: true,但它仍然让我感到困惑,预览/下载按钮不起作用,它看起来像Firebase中的一个错误。任何人都可以确认吗?

2 个答案:

答案 0 :(得分:4)

1)只要它总是公开的,它就不会过期。 (我在底部添加了与此相关的链接)

2)这是快速修复。 (您可以执行以下任一操作)

  • 添加自己的默认ACL(下面是使用gsutil的命令)
  

gsutil defacl ch -u your_email@mail.com:OWNER gs:// your_bucket;

  • 将自己添加为Google IAM管理控制台中的存储管理员

然后重新上传你的文件......

<强> TL; DR

根据Firebase Documentation

,这就是原因
  

您可以使用Google云端存储API访问通过上传的文件   适用于云存储的Firebase SDK,尤其适用于执行更复杂的操作   操作,例如复制或移动文件,或列出所有文件   可以参考。

     

请注意,这些请求使用Google云端存储非常重要   ACL或项目级别IAM,而不是Firebase身份验证和   存储安全规则。

关于public:true,我认为它只会启用和创建公共链接。请参阅here

答案 1 :(得分:2)

您的网址不应更改或过期,并且在撤消之前它们应该有效,这可以通过对象更新发生,也可以通过在firebase网络控制台中明确撤销网址来实现。至少据我所知。

首先我想到的是:你有没有在桶上配置CORS?这可能是一个原因。 Check this out

我能想到的第二件事是存储规则。如果您有类似allow read: if request.auth.uid == userId;的内容,则可能需要删除这些内容以使文件可公开访问。您可以使用类似的方法将路径中的所有文件设为公共:

 service firebase.storage {
  match /b/XXXXXX.appspot.com/o {
    match /{allPaths=**} {
      allow read;
    }
  }

如果你已经完成了这两件事,那么不幸的是它实际上也可能是一个firebase错误。祝你好运!