问题:
我需要能够从为Firebase存储中的图像生成的下载URL中删除所有链接修饰。 但是,当剥离所有链接修饰后,当前生成的链接将返回图像元数据的JSON文档。
上下文:
流程如下:
图像从iOS应用程序上传到Firebase。完成此操作后,下载URL将以POST请求的形式发送到外部服务器。
URL的发送服务器在提交图像URL时不接受链接修饰。
目标:
更改Firebase Storage下载URL,例如将其删除所有链接修饰,例如:
注释:
问题实际上是双重的,首先需要对链接进行操作以删除所有链接装饰。然后,链接的行为需要更改,因为要返回图像,您需要在文件扩展名(在本例中为.jpg)后加上?alt = media。目前,如果没有链接修饰,则使用具有所需结构的链接会返回元数据的JSON文档。
当前链接结构如下:
所需的链接结构:
根据适当的安全规则访问令牌是必要的,但是使用适当的读取权限可以忽略该令牌。我可以根据需要调整规则,但仍然需要能够删除?alt = media并返回图像。
答案 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
参数就可以访问它们。如果您不想向所有人公开,则可以随意使用那里的权限。