【问题标题】:Where's the iPhone MIME type database?iPhone MIME 类型数据库在哪里?
【发布时间】:2011-01-27 04:43:30
【问题描述】:

我有一个 iPhone 程序,它应该在给定文件名列表的情况下执行智能操作(为文件类型挑选适当的图标)。我正在寻找 iPhone 上的 /etc/mime.types 或类似的东西——我假设 API 调用可用于手机。这存在吗?

【问题讨论】:

    标签: iphone objective-c cocoa cocoa-touch


    【解决方案1】:

    如果是这样,您的应用肯定没有权限直接读取它。你想做什么?

    编辑

    这是我前段时间写的一个函数。我是为 Mac 编写的,但看起来 iPhone 上存在相同的功能。基本上,你给它一个文件名,它使用路径扩展名来返回文件的 MIME 类型:

    #import <MobileCoreServices/MobileCoreServices.h>
    ...
    - (NSString*) fileMIMEType:(NSString*) file {
        CFStringRef UTI = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, (CFStringRef)[file pathExtension], NULL);
        CFStringRef MIMEType = UTTypeCopyPreferredTagWithClass (UTI, kUTTagClassMIMEType);
        CFRelease(UTI);
        return [(NSString *)MIMEType autorelease];
    }
    

    【讨论】:

    • Does not work on iPhone - 我的错。您需要包含 MobileCoreServices 框架和#import &lt;MobileCoreServices/MobileCoreServices.h&gt;
    • 我在一个 iPad 设备 (iPad 1st gen / 5.1.1) 上的 pdf 文件代码有问题,但在另一个 (iPad 3 / 5.1.1) 或模拟器 ( 5.1)。 pathExtension 是 pdf,UTI 以 com.adobe.pdf 的形式返回 OK,但 MIMEType 返回 nil。有什么可能导致这种情况吗?设备上的 MIMEType 注册表会损坏吗?
    • @slf 是的,这基本上等同于答案中的内容。
    【解决方案2】:

    以下函数将返回 Swift 2

    中给定文件扩展名的 mime 类型
    import MobileCoreServices
    
    func mimeTypeFromFileExtension(fileExtension: String) -> String? {
        guard let uti: CFString = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, fileExtension as NSString, nil)?.takeRetainedValue() else {
            return nil
        }
    
        guard let mimeType: CFString = UTTypeCopyPreferredTagWithClass(uti, kUTTagClassMIMEType)?.takeRetainedValue() else {
            return nil
        }
    
        return mimeType as String
    }
    

    【讨论】:

      【解决方案3】:

      在 obj-C 中,警告使用 C 时内存泄漏。

      - (NSString *)guessMIMETypeFromFileName: (NSString *)fileName {
          CFStringRef UTI = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, (__bridge CFStringRef)[fileName pathExtension], NULL);
          CFStringRef MIMEType = UTTypeCopyPreferredTagWithClass(UTI, kUTTagClassMIMEType);
          CFRelease(UTI);
          if (!MIMEType) {
              return @"application/octet-stream";
          }
          NSString *dest = [NSString stringWithString:(__bridge NSString *)(MIMEType)];
          CFRelease(MIMEType);
      
          return dest;
      }
      

      【讨论】:

        【解决方案4】:

        更新对 Swift 5.3 的优秀且被接受的答案,作为 URL 扩展

        extension URL {
            var mime: String {
                guard
                    let uti = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, pathExtension as CFString, nil)
                else { return "" }
                let mime = uti.takeRetainedValue() as String
                uti.release()
                return mime
            }
        }
        

        【讨论】:

          猜你喜欢
          • 2015-06-23
          • 2012-07-30
          • 2016-08-03
          • 2013-12-26
          • 2011-12-07
          • 1970-01-01
          • 2012-11-23
          • 2010-11-24
          相关资源
          最近更新 更多