【问题标题】:Path extension and MIME type of file in swiftswift中文件的路径扩展名和MIME类型
【发布时间】:2015-09-23 10:53:20
【问题描述】:

我正在快速学习,我制作了一个表格,其中包含显示图像的单元格和按 MIME TYPE 分组的类(使用路径扩展名)。 我有一个关于扩展的问题。 如果图像(例如,它可能是视频或 pdf)是从互联网上获取的,我不确定它们是否有扩展名 如何在不使用路径扩展名的情况下获取文件系统中文件的 MIMEtype ? PS:对不起,我的英语不好,这不是我的母语

【问题讨论】:

    标签: ios swift mime-types


    【解决方案1】:

    如果有人想从文件的实际 URL 中获取 MimeType,此代码对我有用:

    import MobileCoreServices
    
    func mimeTypeForPath(path: String) -> String {
        let url = NSURL(fileURLWithPath: path)
        let pathExtension = url.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"
    }
    

    【讨论】:

    • 我收到此错误:使用未解析的标识符 'UTTypeCreatePreferredIdentifierForTag'
    • @amirt import MobileCoreServices
    • 我在许多其他人中找到的最佳答案。它们都使用类型列表。谢谢
    • 也可以通过以下方式获得UTI: Let uti = (try?url.resourceValues(forKeys: [.typeIdentifierKey]))?.typeIdentifier ?? ""
    • 所以它使用路径扩展。答案是“如何在不使用路径扩展名的情况下获取文件系统中文件的 MIMEtype ?”
    【解决方案2】:

    如果您需要检查 URL 是否包含一些图像或音频文件或视频文件,这里是 Swift 5.1 代码:

    import Foundation
    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)
        }
    
    }
    

    【讨论】:

    • 太棒了!你是怎么找到他们的?
    • 这绝对有效
    【解决方案3】:

    使用以下代码

    MimeType.swift

    import Foundation
    
    internal let DEFAULT_MIME_TYPE = "application/octet-stream"
    
    internal let mimeTypes = [
        "html": "text/html",
        "htm": "text/html",
        "shtml": "text/html",
        "css": "text/css",
        "xml": "text/xml",
        "gif": "image/gif",
        "jpeg": "image/jpeg",
        "jpg": "image/jpeg",
        "js": "application/javascript",
        "atom": "application/atom+xml",
        "rss": "application/rss+xml",
        "mml": "text/mathml",
        "txt": "text/plain",
        "jad": "text/vnd.sun.j2me.app-descriptor",
        "wml": "text/vnd.wap.wml",
        "htc": "text/x-component",
        "png": "image/png",
        "tif": "image/tiff",
        "tiff": "image/tiff",
        "wbmp": "image/vnd.wap.wbmp",
        "ico": "image/x-icon",
        "jng": "image/x-jng",
        "bmp": "image/x-ms-bmp",
        "svg": "image/svg+xml",
        "svgz": "image/svg+xml",
        "webp": "image/webp",
        "woff": "application/font-woff",
        "jar": "application/java-archive",
        "war": "application/java-archive",
        "ear": "application/java-archive",
        "json": "application/json",
        "hqx": "application/mac-binhex40",
        "doc": "application/msword",
        "pdf": "application/pdf",
        "ps": "application/postscript",
        "eps": "application/postscript",
        "ai": "application/postscript",
        "rtf": "application/rtf",
        "m3u8": "application/vnd.apple.mpegurl",
        "xls": "application/vnd.ms-excel",
        "eot": "application/vnd.ms-fontobject",
        "ppt": "application/vnd.ms-powerpoint",
        "wmlc": "application/vnd.wap.wmlc",
        "kml": "application/vnd.google-earth.kml+xml",
        "kmz": "application/vnd.google-earth.kmz",
        "7z": "application/x-7z-compressed",
        "cco": "application/x-cocoa",
        "jardiff": "application/x-java-archive-diff",
        "jnlp": "application/x-java-jnlp-file",
        "run": "application/x-makeself",
        "pl": "application/x-perl",
        "pm": "application/x-perl",
        "prc": "application/x-pilot",
        "pdb": "application/x-pilot",
        "rar": "application/x-rar-compressed",
        "rpm": "application/x-redhat-package-manager",
        "sea": "application/x-sea",
        "swf": "application/x-shockwave-flash",
        "sit": "application/x-stuffit",
        "tcl": "application/x-tcl",
        "tk": "application/x-tcl",
        "der": "application/x-x509-ca-cert",
        "pem": "application/x-x509-ca-cert",
        "crt": "application/x-x509-ca-cert",
        "xpi": "application/x-xpinstall",
        "xhtml": "application/xhtml+xml",
        "xspf": "application/xspf+xml",
        "zip": "application/zip",
        "epub": "application/epub+zip",
        "docx": "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
        "xlsx": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
        "pptx": "application/vnd.openxmlformats-officedocument.presentationml.presentation",
        "mid": "audio/midi",
        "midi": "audio/midi",
        "kar": "audio/midi",
        "mp3": "audio/mpeg",
        "ogg": "audio/ogg",
        "m4a": "audio/x-m4a",
        "ra": "audio/x-realaudio",
        "3gpp": "video/3gpp",
        "3gp": "video/3gpp",
        "ts": "video/mp2t",
        "mp4": "video/mp4",
        "mpeg": "video/mpeg",
        "mpg": "video/mpeg",
        "mov": "video/quicktime",
        "webm": "video/webm",
        "flv": "video/x-flv",
        "m4v": "video/x-m4v",
        "mng": "video/x-mng",
        "asx": "video/x-ms-asf",
        "asf": "video/x-ms-asf",
        "wmv": "video/x-ms-wmv",
        "avi": "video/x-msvideo"
    ]
    
    internal func MimeType(ext: String?) -> String {
        return mimeTypes[ext?.lowercased() ?? "" ] ?? DEFAULT_MIME_TYPE
    }
    
    extension NSURL {
        public func mimeType() -> String {
            return MimeType(ext: self.pathExtension)
        }
    }
    
    extension URL {
        public func mimeType() -> String {
            return MimeType(ext: self.pathExtension)
        }
    }
    
    extension NSString {
        public func mimeType() -> String {
            return MimeType(ext: self.pathExtension)
        }
    }
    
    extension String {
        public func mimeType() -> String {
            return (self as NSString).mimeType()
        }
    }
    

    如何使用

    let string = "https://homepages.cae.wisc.edu/~ece533/images/boat.png"
    
    let mimeType = string.mimeType()
    

    适用于 NSURLURLNSStringString

    参考:https://gist.github.com/ngs/918b07f448977789cf69

    【讨论】:

    • 现在 UTTypeCreatePreferredIdentifierForTag 已被弃用,这似乎是唯一的方法。
    【解决方案4】:

    要从 UTI 获取扩展,这里是 Swift 4.1 代码:

    import AVFoundation
    
    extension AVFileType {
        /// Fetch and extension for a file from UTI string
        var fileExtension: String {
            if let ext = UTTypeCopyPreferredTagWithClass(self as CFString, kUTTagClassFilenameExtension)?.takeRetainedValue() {
                return ext as String
            }
            return "None"
        }
    }
    

    movcom.apple.quicktime-movie

    【讨论】:

      【解决方案5】:

      假设您以 NSData 的形式接收数据,请关注此帖子:https://stackoverflow.com/a/5042365/2798777

      以 Swift 为例:

      var c = [UInt32](count: 1, repeatedValue: 0)
      (data as! NSData).getBytes(&c, length: 1)
      switch (c[0]) {
      case 0xFF, 0x89, 0x00:
          println("image")
      case 0x47:
          println("gif")
      default: 
          println("unknown: \(c[0])")
      }
      

      【讨论】:

        【解决方案6】:

        iOS15兼容版@Dmih's solution如下图:

        import UniformTypeIdentifiers
        
        extension URL {
            func mimeType() -> String {
                let pathExtension = self.pathExtension
                if let type = UTType(filenameExtension: pathExtension) {
                    if let mimetype = type.preferredMIMEType {
                        return mimetype as String
                    }
                }
                return "application/octet-stream"
            }
            
            var containsImage: Bool {
                let mimeType = self.mimeType()
                if let type = UTType(mimeType: mimeType) {
                    return type.conforms(to: .image)
                }
                return false
            }
            
            var containsAudio: Bool {
                let mimeType = self.mimeType()
                if let type = UTType(mimeType: mimeType) {
                    return type.conforms(to: .audio)
                }
                return false
            }
            
            var containsMovie: Bool {
                let mimeType = self.mimeType()
                if let type = UTType(mimeType: mimeType) {
                    return type.conforms(to: .movie)   // ex. .mp4-movies
                }
                return false
            }
            
            var containsVideo: Bool {
                let mimeType = self.mimeType()
                if let type = UTType(mimeType: mimeType) {
                    return type.conforms(to: .video)
                }
                return false
            }
        }
        

        【讨论】:

          【解决方案7】:

          @Dmih 给出的答案的帮助下,我修改了它 根据我需要 mime 类型字符串的项目要求 上传选定的文件。这可能对其他人有帮助。

            import Foundation
            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)
                          }
          
                      //Get current mime type of url w.r.t its url
                          var currentMimeType: String {
          
                              if self.containsImage{
                                  return "image/png"
                              }else if self.containsAudio{
                                  return "audio/mp3"
                              }else if self.containsVideo{
                                  return "video/mp4"
                              }
          
                              return ""
                          }
                      }
          

          【讨论】:

          • UTTypeCreatePreferredIdentifierForTag 现已弃用。
          猜你喜欢
          • 2010-12-09
          • 1970-01-01
          • 2010-11-05
          • 2010-10-03
          • 2011-05-14
          • 1970-01-01
          • 2010-09-07
          相关资源
          最近更新 更多