使用 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 的命令)在 Google IAM 管理控制台中将自己添加为存储管理员gsutil defacl ch -u your_email@mail.com:OWNER gs://your_bucket;
然后重新上传你的文件....
TL;DR
这就是原因,根据Firebase Documentation:
您可以使用 Google Cloud Storage API 访问通过以下方式上传的文件 适用于 Cloud Storage 的 Firebase SDK,尤其适用于执行更复杂的 操作,例如复制或移动文件,或列出所有文件 参考资料。
请务必注意,这些请求使用 Google Cloud Storage ACL 或项目级 IAM,而不是 Firebase 身份验证和 存储安全规则。
关于public:true
,我认为它只会启用和创建公共链接。参考here
【讨论】:
以上是关于使用 node.js 进行 Firebase 存储/桶公开上传的主要内容,如果未能解决你的问题,请参考以下文章
无法使用 Node.js 在 Firebase 云存储中保存 CustomMetadata
使用node.js中的firebase从谷歌云存储读取时,ESlint问题“每个都应该返回一个值或抛出”