iPhone MIME 类型数据库在哪里?

20

我有一个针对iPhone的程序,应该能够通过给定的文件名列表(选出适当的文件类型图标)并做出智能决策。 我想知道iPhone是否有类似于/etc/mime.types或类似的东西 - 我假设可以在手机上使用API调用。这个存在吗?

4个回答

49
如果是这样,你的应用程序肯定没有权限直接读取它。你想做什么?
编辑:
这是我以前写的一个函数。我为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];
}

8
不适用于iPhone-我的错。您需要添加MobileCoreServices框架,并包含#import <MobileCoreServices/MobileCoreServices.h> - jww
我在一个iPad设备(iPad 1st gen / 5.1.1)上使用这段代码处理PDF文件时遇到了问题,但在另一个设备(iPad 3 / 5.1.1)或模拟器(5.1)上没有问题。pathExtension是pdf,UTI返回为com.adobe.pdf,但MIMEType返回nil。有什么可能导致这种情况吗?设备上的MIMEType注册表会出现损坏吗? - Ian Kershaw
1
@slf 是的,那基本上等同于答案中的内容。 - Dave DeLong

4
以下函数将返回在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
}

1

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

0

更新伟大且被接受的答案至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
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接