如何使用Firebase Storage存储到图像的“直接链接”

6uxekuva  于 2023-05-07  发布在  其他
关注(0)|答案(9)|浏览(224)

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

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

据我所知,它只能使用gs://协议的这种类型的URL,但是,它不能通过链接访问,只能在SDK API中访问。
我需要一个解决方案完全如上所述使用Firebase平台,如果不可能,接受其他建议。
我的代码中有一些常量,它们是指向图像的链接。事实证明,如果我想更新这张图片,我必须进行新的部署。相反,我想在同一个URL更新图像。这将是不可能做到这一点与firebase(据我所知),因为由存储提供的URL是无法访问的链接。
另一种替代方法是将图像转换为base64并存储在数据库中,但这将是非常广泛和不切实际的。

qnzebej0

qnzebej01#

如何通过示例将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;
    }
  }
}
vom3gejh

vom3gejh2#

使用Firebase Storage,您可以使用两个URL来表示文件:

// "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:// URL转换为公共https:// URL。
第二个选项允许您与受信任的个人共享此公开但无法猜测的URL,并允许他们在不对Firebase进行身份验证或使用您的应用程序的情况下访问内容-例如与Google Photos共享家庭照片。这种行为可能已经足够好了,除非你想要用干净的URL公开共享。您可以在浏览器中使用此URL,或使用任何其他HTTP库来下载它。我们也提供下载这些文件的功能(参考),所以你不需要获得第三方库,你可以直接使用我们。
我强烈建议阅读our docs以获得更多信息。

smdnsysy

smdnsysy3#

2020年,我很难弄清楚这一点,特别是因为Swift中CharacterSet编码字符串的限制(或者很可能我错过了一些东西)。
以下是我如何设法转换Firebase存储上Blob的“路径”(文件夹路径)的步骤(上传后)。
1.上传后,给定一个存储元数据(在iOS中,我们有一个名为FIRStorageMetadata的类),获取名为pathbucket的字符串对象。

  • 正确编码路径字符串!这很重要!如果你错过了一个字符,显然你会得到一个错误,当你试图下载完整的直接网址。
  • 在iOS中,我使用CharacterSet urlHostAllowed编码路径字符串。但是,这是不够的,就像我在上面说的,它要么是没有字符集编码字符串到一个URL,包括**"+'加号。因此,在使用urlHostAllowed编码之后,我调用替换出现字符串方法,将"+"替换为"%2B”**
  • 测试路径字符串编码是否正确的一种方法是将编码结果与从Firebase Storage UI获得的结果进行比较。
  • 连接字符串:
  • https://firebasestorage.googleapis.com/v0/b/
  • 桶对象
  • “/o/”
  • 正确编码的路径对象。
  • “?alt=media”

瞧!

常见问题

1.* *token**可以省略吗?是的,当然。它只是工作。从我学会就一直在做。
1.我们可以省略?alt=media吗?不!你只会得到一个json格式的字符串,而不是文件。

1rhkuytd

1rhkuytd4#

对于那些谁只是想得到一个链接
console > Storage
选择一个特定的照片,你会看到下面的链接。

balp4ylt

balp4ylt5#

2020年***

Firebase已连接Google Cloud Platform:

您需要在Google Cloud Platform上公开存储桶或所需对象,然后您将获得一个简单的链接,无需编辑它:
Making data public
您也可以在不公开数据的情况下使用该链接(但您必须登录才能访问):
转到Google Cloud Platform>选择项目>存储>浏览器>打开bucket appID.appspot.com>打开任何对象,在那里你有URI(Firebase控制台提供的)和URL。

  • 我尝试了所有的方法在这里,但他们不再工作了
a2mppw5e

a2mppw5e6#

转换为公共URL检查示例。
假设链接是gs:funzone-website.appspot.com/public/logo.jpg
let g= funzone-website.appspot.com/public/logo.jpg
如果存在文件夹,则将文件路径替换为%。在上面的例子中,public是一个文件夹,添加?alt=media和add 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

92dk7w1h

92dk7w1h7#

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

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

PROJECT-ID:Firebase项目的项目ID
FILEPATH:项目文件的路径

hwazgwia

hwazgwia8#

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

您可以尝试这样做,因为它允许公共读访问

hs1ihplo

hs1ihplo9#

如果你想把照片公之于众-
将此添加到存储规则中

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

然后你就可以像

export const getMedia = (folderId, mediaId) =>`https://firebasestorage.googleapis.com/v0/b/${process.env.NEXT_PUBLIC_FIREBASE_STORAGE_BUCKET}/o/${folderId}%2F${mediaId}?alt=media`;

相关问题