【问题标题】:how to detect if Firebase url is Photo or Video - Swift如何检测 Firebase url 是照片还是视频 - Swift
【发布时间】:2021-02-09 02:51:08
【问题描述】:

我一直在试图弄清楚如何检测我从 Firebase 存储中检索到的 url 是照片还是视频,

我关注了这个question,但它似乎不适用于 Firebase Storage URLs

该问题中实施的解决方案在 url 末尾有 extension 时才起作用。 这是我实现的代码:

extension String {
public func isImageType() -> Bool {
    // image formats which you want to check
    let imageFormats = ["jpg", "png", "gif"]

    if URL(string: self) != nil  {

        let extensi = (self as NSString).pathExtension

        return imageFormats.contains(extensi)
    }
    return false
    }
}

需要明确的是,从Firebase 检索到的URLs 具有这种形式。

照片网址示例:

https://firebasestorage.googleapis.com/v0/b/myApp-1e48d.appspot.com/o/Images%2FD118DA58-C128-4E5E-BF24-AA820BEE5590.jpg?alt=media&token=49eie236-f9d1-45f8-bd0b-887382c61ccd

视频网址示例:

https://firebasestorage.googleapis.com/v0/b/myApp-1e48d.appspot.com/o/Videos%2F1E4B7CA0-4D0E-4AC5-9856-2F59D0811C47.mp4?alt=media&token=615teacf-0d20-48aa-bb8f-cew84a14d76d

如您所见,extension 不在末尾(因为需要令牌),因此之前链接的扩展方法不起作用。

我如何才能知道从 Firebase 检索到的 url 是照片还是视频?

【问题讨论】:

  • 您可以很容易地删除查询字符串(问号后的所有内容)并从那里解析扩展名。或者,您可以将媒体类型与 URL 一起存储在您使用的任何数据库中。

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


【解决方案1】:

我实现了一个有效的代码:

  1. 第一Remove all after "?"

    extension String {
    public func removeAfterExtension() -> String?{
     if let index = (self.range(of: "?")?.lowerBound){
         let beforeEqualsTo = String(self.prefix(upTo: index))
         return beforeEqualsTo
     }else{
         return self
        }
    }
    

然后检查是不是image Type:

public func isImageType() -> Bool {
    // image formats which you want to check
    let imageFormats = ["jpg", "png", "gif"]

    if URL(string: self) != nil  {

        let extensi = (self as NSString).pathExtension

        return imageFormats.contains(extensi)
    }
    return false
}

【讨论】:

  • 这段代码在技术上没有任何问题。然而。如果存储格式发生变化,它可能会中断。更好的选择是遵循道格在评论中的建议。只需将文件类型与 url 一起存储为另一个字段 - 它也将少一个扩展名和更少的代码。
  • 我不明白如何实现它,你能详细解释一下吗?我从存储参考下载了这个 url,我不明白如何“将文件类型与 url 一起存储为另一个字段”
  • @StackGU 将 url 存储在数据库中时(如指南中所示),您还可以存储文件类型、图像名称、时间戳、用户发布等。您可以接近然而,它效果最好,但利用数据库也有优势。
  • @Jay OP 发布了他的问题是试图从 NSString 获取路径扩展。解决方案就是从 URL 获取就这么简单。当然你可以存储文件类型,但这不是这里的问题。
  • 谢谢@Jay 实际上我将所有这些信息都存储在 Firestore 文档中,所以 Leo Dabus 建议的简单解决方案似乎可以正常工作
【解决方案2】:

您可以简单地使用您的链接初始化一个 url 并获取路径扩展名:

let link1 = "https://firebasestorage.googleapis.com/v0/b/myApp-1e48d.appspot.com/o/Images%2FD118DA58-C128-4E5E-BF24-AA820BEE5590.jpg?alt=media&token=49eie236-f9d1-45f8-bd0b-887382c61ccd"

if let url = URL(string: link1) {
    let fileType = url.pathExtension  // "jpg"
}


let link2 = "https://firebasestorage.googleapis.com/v0/b/myApp-1e48d.appspot.com/o/Videos%2F1E4B7CA0-4D0E-4AC5-9856-2F59D0811C47.mp4?alt=media&token=615teacf-0d20-48aa-bb8f-cew84a14d76d"

if let url = URL(string: link2) {
    let fileType = url.pathExtension  // "mp4"
}

【讨论】:

  • 这里很好,但他们没有将 URL 存储在任何地方(而不是将其存储在数据库中,这通常是这样做的);他们试图直接从 Storage 中获取所有 url。
  • @Jay OP 表示字符串是这样来的。这就是他所需要的
  • 是的 - 我只是想画一个更大的图。
猜你喜欢
  • 1970-01-01
  • 2020-12-06
  • 1970-01-01
  • 1970-01-01
  • 2017-07-13
  • 1970-01-01
  • 2012-03-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多