Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何检测Firebase url是照片还是视频-Swift_Swift_Firebase_Url_Google Cloud Firestore_Firebase Storage - Fatal编程技术网

如何检测Firebase url是照片还是视频-Swift

如何检测Firebase url是照片还是视频-Swift,swift,firebase,url,google-cloud-firestore,firebase-storage,Swift,Firebase,Url,Google Cloud Firestore,Firebase Storage,我一直在想如何检测我从Firebase存储中检索到的url是照片还是视频 我遵循了这一点,但它似乎不适用于Firebase存储URL 该问题中实现的解决方案仅在url末尾具有扩展名时才起作用。 这是我实现的代码: extension String { public func isImageType() -> Bool { // image formats which you want to check let imageFormats = ["jpg",

我一直在想如何检测我从Firebase存储中检索到的
url
是照片还是视频

我遵循了这一点,但它似乎不适用于Firebase存储
URL

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

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
检索到的
url
具有此表单

照片url示例:

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

视频url示例:

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

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


我如何才能仍然理解从Firebase检索到的
url
是照片还是视频?

我实现了一个代码:

  • 首先
    删除“?”之后的所有内容

  • 然后检查它是否为
    图像类型

    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并获取路径扩展名:

    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一起存储在你使用的任何数据库中。从技术上讲,这段代码没有错。然而。如果存储格式发生更改,它可能会中断。更好的办法是按照道格在评论中的建议行事。只需将文件类型与url一起存储为另一个字段-它也将减少一个扩展名和更少的代码。我不知道如何实现它,您能向我详细解释一下吗?我从存储参考下载了这个url,我不明白如何“将文件类型与url一起存储为另一个字段”@StackGU当在数据库中存储url时(如指南所示),您还具有存储文件类型、图像名称、时间戳、,哪个用户发布了它等等。你可以接近它,但是效果最好,但是利用数据库也有好处。@Jay OP发布说他的问题是试图从NSString获得路径扩展。解决方案是从URL获取简单的URL。当然你可以存储文件类型,但这不是问题所在。谢谢@Jay,实际上我在Firestore文档中存储了所有信息,所以Leo Dabus建议的简单解决方案在这里似乎很好,但他们没有将URL存储在任何地方(而不是存储在数据库中,通常是这样做的);他们试图直接从存储器中获取所有URL。@Jay OP说字符串是这样的。这就是他所需要的——是的,我只是想画一幅更大的图。
    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"
    }