如何从Firebase Storage下载URL删除查询字符串

时间:2019-10-16 22:46:08

标签: swift firebase google-cloud-firestore firebase-storage firebase-security

问题:

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

上下文:

流程如下:

图像从iOS应用程序上传到Firebase。完成此操作后,下载URL将以POST请求的形式发送到外部服务器。

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

目标:

更改Firebase Storage下载URL,例如将其删除所有链接修饰,例如:

注释:

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

当前链接结构如下:

所需的链接结构:

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

3 个答案:

答案 0 :(得分:1)

您可以使用String.componentsSeparatedByString(_ separator:)

将网址字符串分成两半
Storage.storage().reference().child(filePath).downloadURL(completion: { (url, error) in
    let urlString = url.absoluteString
    let urlStringWithoutQueryString = urlString.componentsSeparatedByString("?").first!
})

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

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

答案 1 :(得分:1)

您应该将从Firebase取回的下载URL视为不透明字符串。在不破坏下载网址的情况下,无法从下载网址中剥离参数。

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

答案 2 :(得分:1)

基于弗兰克的答案,如果您访问关联的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参数就可以访问它们。如果您不想向所有人公开,则可以随意使用那里的权限。