【问题标题】:How to check url is image or video?如何检查网址是图片还是视频?
【发布时间】:2017-06-30 10:03:23
【问题描述】:

fetch API 响应并在 swift 中解析选择 url。但我需要检查是 image url 还是 video url :

如果我得到图像 url 然后显示图像,如果得到视频 url 然后播放视频:

 if let url = postMedia?.url{

    //need to check here 
  }

例如

这是我的视频网址:

https://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4
https://clips.vorwaerts-gmbh.de/big_buck_bunny.mov

这是图片网址:

https://clips.vorwaerts-gmbh.de/big_buck_bunny.png
https://clips.vorwaerts-gmbh.de/big_buck_bunny.jpg

注意:我知道如何显示图像和播放视频

【问题讨论】:

  • 你必须检查 url NSURL(fileURLWithPath: filePath).pathExtension 的扩展名

标签: ios swift


【解决方案1】:

您可以查看下面的图片

let url1 : String = "https://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4"
        let imageExtensions = ["png", "jpg", "gif"]
        //...
        // Iterate & match the URL objects from your checking results
        let url: URL? = NSURL(fileURLWithPath: url1) as URL
        let pathExtention = url?.pathExtension
            if imageExtensions.contains(pathExtention!)
            {
                print("Image URL: \(String(describing: url))")
                // Do something with it
            }else
            {
               print("Movie URL: \(String(describing: url))")
            }

同样你可以查看视频

【讨论】:

  • 如果网址没有扩展名怎么办?就像https://sub.domain.com/video
【解决方案2】:

斯威夫特 3

希望能帮到你

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
    }
}

【讨论】:

  • 我赞成你写干净的代码,但是.为什么要扩展 String 。它应该类似于辅助类。
  • 是的,你说得对,帮助类和扩展都是用于可重用性目的。但在扩展中,您可以直接自行引用类类型。所以你不必在方法参数中传递字符串。
【解决方案3】:

通过以下代码检查url的扩展名:

NSString *stringURL = @"http://...";
NSURL *url = [NSURL URLWithString:stringURL];
NSString *path = [url path];
NSString *extension = [path pathExtension];

如果您的扩展名是 mp4 或 mov,则为视频,否则为 jpg、jpeg、png 等,则为图像

【讨论】:

    【解决方案4】:

    此答案要求框架检查文件扩展名。

    #import <MobileCoreServices/MobileCoreServices.h>
    
    // ...
    
    + (BOOL) urlIsImage:(NSURL*)fileUrl
    {
        if (fileUrl) {
            NSString *extension = fileUrl.pathExtension;
            if (extension && extension.length > 0) {
                CFStringRef uti = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, (__bridge CFStringRef)extension, NULL);
                return uti && UTTypeConformsTo(uti, kUTTypeImage);
            }
        }
    
        return NO;
    }
    

    【讨论】:

    • 最可靠的答案。
    【解决方案5】:

    斯威夫特 3

    请试试这个:

     extension String {
    
            public func isImage() -> Bool {
                // Add here your image formats.
                let imageFormats = ["jpg", "jpeg", "png", "gif"]
    
                if let ext = self.getExtension() {
                    return imageFormats.contains(ext)           
                }
    
                return false
            }
    
            public func getExtension() -> String? {
               let ext = (self as NSString).pathExtension
    
               if ext.isEmpty {
                   return nil
               }
    
               return ext
            }
    
            public func isURL() -> Bool {
               return URL(string: self) != nil
            }
    
        }
    

    【讨论】:

      【解决方案6】:

      斯威夫特

      import MobileCoreServices

      extension URL {
          func mimeType() -> String {
               let pathExtension = self.pathExtension
               if let uti = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, pathExtension as NSString, nil)?.takeRetainedValue() {
                   if let mimetype = UTTypeCopyPreferredTagWithClass(uti, kUTTagClassMIMEType)?.takeRetainedValue() {
                      return mimetype as String
                   }
               }
               return "application/octet-stream"
          }
      
          var containsImage: Bool {
              let mimeType = self.mimeType()
              guard let uti = UTTypeCreatePreferredIdentifierForTag(kUTTagClassMIMEType, mimeType as CFString, nil)?.takeRetainedValue() else {
                   return false
              }
              return UTTypeConformsTo(uti, kUTTypeImage)
          }
      
          var containsAudio: Bool {
              let mimeType = self.mimeType()
              guard let uti = UTTypeCreatePreferredIdentifierForTag(kUTTagClassMIMEType, mimeType as CFString, nil)?.takeRetainedValue() else {
                    return false
              }
              return UTTypeConformsTo(uti, kUTTypeAudio)
          }
          var containsVideo: Bool {
              let mimeType = self.mimeType()
              guard  let uti = UTTypeCreatePreferredIdentifierForTag(kUTTagClassMIMEType, mimeType as CFString, nil)?.takeRetainedValue() else {
                     return false
              }
              return UTTypeConformsTo(uti, kUTTypeMovie)
          }
       }
      

      【讨论】:

      • 嗨 Airza,这段代码在 iOS15(即 Swift5.5)上的表现如何?? (不推荐使用很多)
      【解决方案7】:

      如果您确定文件只能是照片或视频,您可以使用以下简单代码:

      if let data = try? Data(contentsOf: YOUR_LOCAL_URL) {
          if let _: UIImage = UIImage(data: (data)) {
              print("image!")
          } else {
              print("video!")
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-26
        • 2012-07-18
        • 2013-07-11
        • 1970-01-01
        • 2021-02-09
        相关资源
        最近更新 更多