2017-05-31 65 views
5

代码:火力地堡储存/桶公众上传与node.js的

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); 
    } 
}); 

我的文件被成功上传到我的火力存储,但:

  1. 现在,该文件通过URL公开访问: https://storage.googleapis.com/project-id.appspot.com/uploads/12345/full.jpg。我可以在我的应用程序中使用这个固定的URL吗?它可能会改变或过期吗?
  2. public: true似乎打破了火力地堡存储UI:

enter image description here 右侧图像的预览没有显示,我无法通过下载按钮下载图像。另外,有没有下载链接(这我不介意,因为我可以通过上面的链接访问),然后单击“创建新的下载URL”火力地堡时产生

错误生成下载网址

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

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

回答

4

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

2)这里是快速修复。 (你可以做以下任一)

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

的gsutil defacl CH -u your_email @邮件。com:OWNER gs:// your_bucket;

  • 添加自己作为一个存储管理员在谷歌IAM管理控制台

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

TL; DR

这里的原因为什么按照Firebase Documentation

您可以使用谷歌云存储API来访问通过云存储 火力地堡的SDK上传的文件,特别是执行更复杂的 操作,如复制或移动文件,或列出所有 提供参考的文件。

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

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

2

您的网址不应该更改或过期,它们应该有效直到撤销,这可以通过对象更新或显式地通过撤销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; 
    } 
    } 

如果你已经做了这两样东西,然后遗憾的是它实际上可能是一个错误火力太。祝你好运!

+0

我已经与Firebase技术团队联系。 – Chris