如何从 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
分解为String
s 的数组,通过给定分隔符的任何出现来拆分字符串,在本例中为?
。
注意此方法假定?
在 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 中删除查询字符串的主要内容,如果未能解决你的问题,请参考以下文章
如何从 Firebase 存储中获取调整大小的图片下载 URL