使用 node.js 进行 Firebase 存储/桶公开上传

Posted

技术标签:

【中文标题】使用 node.js 进行 Firebase 存储/桶公开上传【英文标题】:Firebase Storage/Bucket public upload with node.js 【发布时间】:2017-10-31 19:39:51 【问题描述】:

代码:

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 存储,但是:

    现在可以通过以下网址公开访问该文件: https://storage.googleapis.com/project-id.appspot.com/uploads/12345/full.jpg。我可以在我的应用程序中使用这个固定的 URL,还是它可能会更改或过期? public: true 似乎破坏了 Firebase 存储 UI:

右侧图像的预览未显示,我无法通过下载按钮下载图像。此外,没有下载网址(我不介意,因为我可以通过上面的链接访问它),当点击“创建新的下载网址”时,Firebase 会产生

生成下载 URL 时出错

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

所以我的计划是坚持使用public: true,但它仍然困扰着我,预览/下载按钮不起作用,对我来说它看起来像是 Firebase 中的一个错误。谁能确认一下?

【问题讨论】:

嗨,我也面临同样的问题。我正在尝试将图像缓冲区上传到 firebase 存储。我看不到图像预览,即使有和没有 public:true 我也看不到公共网址,我也无法从存储桶下载图像/文件。你解决问题了吗? 【参考方案1】:

您的网址不应更改或过期,并且在撤销之前它们应该是有效的,这可以通过对象更新或通过在 Firebase Web 控制台中显式撤销网址来实现。至少据我所知。

我首先想到的是:您是否在存储桶上配置了 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 错误。祝你好运!

【讨论】:

【参考方案2】:

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

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

在默认 ACL 中添加自己(以下是使用 gsutil 的命令)

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

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

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

TL;DR

这就是原因,根据Firebase Documentation:

您可以使用 Google Cloud Storage API 访问通过以下方式上传的文件 适用于 Cloud Storage 的 Firebase SDK,尤其适用于执行更复杂的 操作,例如复制或移动文件,或列出所有文件 参考资料。

请务必注意,这些请求使用 Google Cloud Storage ACL 或项目级 IAM,而不是 Firebase 身份验证和 存储安全规则。

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

【讨论】:

以上是关于使用 node.js 进行 Firebase 存储/桶公开上传的主要内容,如果未能解决你的问题,请参考以下文章

Firebase 函数 Node.js 转换流

无法使用 Node.js 在 Firebase 云存储中保存 CustomMetadata

使用node.js中的firebase从谷歌云存储读取时,ESlint问题“每个都应该返回一个值或抛出”

如何访问 Node.js 服务器上 Functions 内的 Firebase 存储?

firebase 和 node.js 的问题

使用 node.js 和 react.js 客户端启动一个 firebase 功能项目