如何存储"直接链接"使用Firebase Storage

时间:2016-08-05 01:17:16

标签: firebase firebase-storage

我需要通过直接链接访问存储在Firebase存储上的图像,例如

http://myfirebasehost.com/storage/imgIwant.png

据我所知,它只能使用协议gs://这种类型的URL,但是,只有在SDK api中才能通过链接访问它。

我需要完全按照上述使用Firebase平台的解决方案,如果不可能,请接受其他建议。

我的代码有常量,是指向图像的链接。事实证明,如果我想更新这张图片,我必须进行新的部署。相反,我想在同一个URL更新图像。根据我的知识,使用firebase执行此操作是不可能的,因为存储提供的URL无法通过链接访问。

另一个替代方案可能是将图像转换为base64并存储在数据库中,但是会非常广泛且不切实际。

7 个答案:

答案 0 :(得分:14)

使用Firebase存储,您将获得两个可用于表示文件的网址:

// "Private" internal URL, only accessible through Firebase Storage API
// This is protected by Firebase Storage Security Rules & Firebase Auth
gs://bucket/object

// "Public" unguessable URL, accessible by anyone with the link
// This is secured because that token is *very* hard for someone to guess
https://firebasestorage.googleapis.com/v0/bucket/object?alt=media&token=<token>

第一个选项要求您使用reference.getDownloadURL()方法将内部gs://网址转换为公开https://网址。

第二个选项允许您与受信任的个人共享此公开但不可取的URL,并允许他们在未经Firebase身份验证的情况下访问内容或使用您的应用 - 考虑与Google相册共享家庭照片。可能这种行为已经足够好了,除非你希望公共共享干净的URL。您可以在浏览器中使用此URL,也可以使用任何其他HTTP库来下载它。我们也提供下载这些文件的能力(参考文献),因此您不需要获得第三方库,您可以使用我们。

我强烈建议您阅读our docs以获取更多相关信息。

答案 1 :(得分:7)

2020年,我很难解决这个问题,尤其是因为Swift中CharacterSet编码字符串的局限性(或者很可能我缺少了一些东西)。

以下是我设法在Firebase Storage(上传后)上转换Blob的“路径”(文件夹路径)的步骤。

  1. 上传后给出存储元数据,(在iOS中,我们拥有名为FIRStorageMetadata的类。)获得名为pathbucket的字符串对象。
  2. 正确编码路径字符串!这个很重要!如果您错过了一个字符,当您尝试下载完整的直接URL时,显然会出现错误。

    • 在iOS中,我使用CharacterSet urlHostAllowed对路径字符串进行编码。但是,这还不够,就像我在上面说的那样,是没有CharacterSet将字符串编码为包含“ +'加号的URL。 因此,在使用urlHostAllowed进行编码之后,我调用了替换出现字符串方法,将“ +” 替换为“%2B”
    • 测试您是否正确编码路径字符串的一种方法是将编码结果与从Firebase Storage UI获得的编码结果进行比较。
  3. 连接字符串:

Voila!

常见问题解答

  1. 我们可以省略令牌吗?是的,当然了。它就是有效的。自从我学会它以来就一直在做。
  2. 我们可以省略?alt=media吗?不!您只会得到json格式的字符串,而不是文件。

答案 2 :(得分:5)

对于那些只想获得链接的人

console > Storage

选择特定照片,您会看到以下链接。 enter image description here

答案 3 :(得分:5)

如何通过示例将gs storage location翻译为direct url

gs://nobs-f32f2.appspot.com/profile/1s_by_wlop-dc1sdan.jpg

变为

https://firebasestorage.googleapis.com/v0/b/nobs-f32f2.appspot.com/o/profile%2F1s_by_wlop-dc1sdan.jpg?alt=media

1st请确保URL转义您的blob路径。例如,为%2F交换正斜杠(/),为%20交换空格()。

2nd确保您已根据需要打开读取权限。这是一个开放的规则:

service firebase.storage {
  match /b/{bucket}/o {
    match /{allPaths=**} {
      allow read: if true;
      allow write: if request.auth != null;
    }
  }
}

答案 4 :(得分:0)

另一个选项是以下格式的URL:

https://storage.googleapis.com/PROJECT-ID/FILEPATH

PROJECT-ID:Firebase项目的项目ID

FILEPATH:项目文件的路径

答案 5 :(得分:0)

2020

Firebase已连接到Google Cloud Platform:

您需要在Google Cloud Platform上公开存储桶或所需的对象,然后您将获得一个简单的链接而无需对其进行编辑:

Making data public

您还可以在不公开数据的情况下使用该链接(但随后您必须登录才能访问):

转到Google Cloud Platform>选择项目>存储>浏览器>打开存储区appID.appspot.com>打开任何对象,然后您就拥有了uri(Firebase控制台提供)和URL。

  • 我在这里尝试了所有给定的方法,但是它们不再起作用了

答案 6 :(得分:0)

转换为公共 URL 检查示例。

假设链接是 gs://funzone-website.appspot.com/public/logo.jpg

let g=funzone-website.appspot.com/public/logo.jpg

如果有文件夹,用 % 替换文件路径。在上面的例子中,public是一个文件夹,添加?alt=media并添加o。

现在 g=funzone-website.appspot.com/o/public%2Flogo.jpg?alt=media

用 %2F 转换和替换路径(/)

要转换此使用 https://firebasestorage.googleapis.com/v0/b/{g}

https://firebasestorage.googleapis.com/v0/b/funzone-website.appspot.com/o/public%2Flogo.jpg?alt=media

如果没有文件夹(公共)则链接是

https://firebasestorage.googleapis.com/v0/b/funzone-website.appspot.com/o/logo.jpg?alt=media