如何从 Firebase 存储下载 URL 中删除查询字符串

Posted

技术标签:

【中文标题】如何从 Firebase 存储下载 URL 中删除查询字符串【英文标题】:How to remove query string from Firebase Storage download URL 【发布时间】:2020-02-13 18:48:54 【问题描述】:

问题:

我需要能够从为 Firebase 存储中的图像生成的下载 URL 中删除所有链接装饰。 但是,当所有链接装饰都被剥离时,生成的链接当前将返回图像元数据的 JSON 文档。

上下文:

流程如下:

图片从 ios 应用上传到 Firebase。完成后,下载 URL 将通过 POST 请求发送到外部服务器。

在提交图像 URL 时,要发送 URL 的服务器不接受链接修饰。

目标:

更改 Firebase 存储下载 URL,例如将其去除所有链接装饰,如下所示:

https://firebasestorage.googleapis.com/v0/b/example.appspot.com/o/[FOLDER_NAME]%[IMAGE_NAME].jpg

注意事项:

问题确实是双重的,首先需要对链接进行操作以删除所有链接装饰。然后需要更改链接的行为,因为为了返回图像,您需要在文件扩展名后面加上 ?alt=media,在本例中为 .jpg。目前,如果没有链接修饰,使用具有我想要的结构的链接将返回元数据的 JSON 文档。

目前的链接结构如下:

https://firebasestorage.googleapis.com/v0/b/example.appspot.com/o/[FOLDER_NAME]%[IMAGE_NAME].jpg?alt=media&token=[TOKEN]

所需的链接结构:

https://firebasestorage.googleapis.com/v0/b/example.appspot.com/o/[FOLDER_NAME]%[IMAGE_NAME].jpg

令牌是访问图像所必需的,具体取决于适当的安全规则,但可以通过适当的读取权限忽略。我可以根据需要调整规则,但我仍然需要能够删除 ?alt=media 并仍然返回图像。

【问题讨论】:

所以你只想从返回的 url 中获取 folder_name 和 image_name? 或者你只是想删除查询字符串(?alt=medi&token=[TOKEN])? 我要删除查询字符串 【参考方案1】:

根据 Frank 的回答,如果您访问关联的 Google Cloud Platform 项目,在“存储”选项卡中找到存储桶并将此存储桶公开,您将能够从此处以您希望的格式获取图像。也就是说,您不会通过 Firebase 访问

https://firebasestorage.googleapis.com/v0/b/example.appspot.com/o/[FOLDER_NAME]%[IMAGE_NAME].jpg

但通过 Google Cloud Storage,带有类似的链接

https://storage.googleapis.com/[bucket_name]/[path_to_image]

在您的 GCP 项目控制台中,访问与您在 Firebase 项目中同名的存储分区。他们是同一个桶。然后通过关注these steps 将存储桶公开。之后,您将能够如上所述构建您的链接,并且无需令牌和alt=media 参数即可访问它们。如果您不想向所有人公开,您可以随意使用那里的权限。

【讨论】:

谢谢,我在控制台找到了我需要的链接。下一步:让 iOS 应用从 GCP 访问下载链接 “让 iOS 应用程序从 GCP 访问下载链接”是什么意思?如果内容在同一个bucket中,只需要知道文件名即可。 URL 的其余部分始终相同,并且与您在问题中提到的方式相同,但使用上述结构。如果现在还有其他与 iOS 相关的东西,也许你应该打开一个不同的线程。如果此答案对您解决发布的主要问题(获取上传到存储桶的图像的下载 URL)有效,则接受该答案将有助于其他有相同问题的用户更轻松地找到此线程 =) 是的,抱歉,我在评论后才知道。【参考方案2】:

您可以使用 String.componentsSeparatedByString(_ separator:) 将 url 字符串分成两半

Storage.storage().reference().child(filePath).downloadURL(completion:  (url, error) in
    let urlString = url.absoluteString
    let urlStringWithoutQueryString = urlString.componentsSeparatedByString("?").first!
)

StorageReference 上调用 .downloadURL 将返回该 URL,但此方法可用于从任何 URL 中删除查询字符串。 String.componentsSeparatedByString(_ separator:)String 分解为Strings 的数组,通过给定分隔符的任何出现来拆分字符串,在本例中为?

注意此方法假定? 在 url 字符串中仅出现一次,我相信所有 Firebase 存储 url 都是这种情况。

【讨论】:

我试试看! 这样确实解决了删除查询字符串的问题,但是新链接返回 JSON 元数据文档而不是实际图像。 获取图片需要token 据我了解,您需要 alt=media 来获取图像 是的,我刚刚将 ?alt=media 添加到剥离的 url,它返回了图像【参考方案3】:

您应该将从 Firebase 返回的下载 URL 视为不透明的字符串。在不破坏下载 URL 的情况下,无法从下载 URL 中去除参数。

如果您希望通过更简单的 URL 允许公开访问存储桶中的文件,请考虑使用 making the object in your (or even your entire) bucket public。

【讨论】:

即使我公开了存储桶或对象,我是否仍然需要 alt=media 来返回实际图像?

以上是关于如何从 Firebase 存储下载 URL 中删除查询字符串的主要内容,如果未能解决你的问题,请参考以下文章

如何从 URL 中删除 Firebase 存储文件

如何从 Firebase 存储中获取调整大小的图片下载 URL

如何使用颤振删除 Firebase 存储文件?

从多个文件上传 Firebase 存储中获取下载 url

如何让用户从 web 应用程序上的 firebase 存储下载图像?

如何从 Firebase 存储 getDownloadURL 获取 URL