从NSData确定MIME类型?

ble*_*908 22 objective-c nsdata ios mime-types

您如何确定NSData对象的mime类型?我计划让用户从他们的iPhone上传视频/图片,并将该文件包装在NSData类中.

我想知道我是否可以告诉NSData的mime类型.这个问题只有几个答案,最近一个是2010年(4年前!).谢谢!

NSData *data; // can be an image or video
NSString *mimeType = [data getMimetype]; // how would I implement getMimeType
Run Code Online (Sandbox Code Playgroud)

Tib*_*Tib 37

基于ml的类似帖子的回答,我添加了NSData的mime类型确定:

ObjC:

+ (NSString *)mimeTypeForData:(NSData *)data {
    uint8_t c;
    [data getBytes:&c length:1];

    switch (c) {
        case 0xFF:
            return @"image/jpeg";
            break;
        case 0x89:
            return @"image/png";
            break;
        case 0x47:
            return @"image/gif";
            break;
        case 0x49:
        case 0x4D:
            return @"image/tiff";
            break;
        case 0x25:
            return @"application/pdf";
            break;
        case 0xD0:
            return @"application/vnd";
            break;
        case 0x46:
            return @"text/plain";
            break;
        default:
            return @"application/octet-stream";
    }
    return nil;
}
Run Code Online (Sandbox Code Playgroud)

迅速:

static func mimeType(for data: Data) -> String {

    var b: UInt8 = 0
    data.copyBytes(to: &b, count: 1)

    switch b {
    case 0xFF:
        return "image/jpeg"
    case 0x89:
        return "image/png"
    case 0x47:
        return "image/gif"
    case 0x4D, 0x49:
        return "image/tiff"
    case 0x25:
        return "application/pdf"
    case 0xD0:
        return "application/vnd"
    case 0x46:
        return "text/plain"
    default:
        return "application/octet-stream"
    }
}
Run Code Online (Sandbox Code Playgroud)

这只处理主文件类型,但您可以完成它以满足您的需要:此处提供所有文件签名,只需使用与我相同的模式.

PS:这里有所有相应的mime类型

  • 然后找到您要检测的音频文件类型以及每种文件类型的大小写。示例:根据文件签名的数组,WMA的第一个字节为0x30,因此添加大小写0x30:return @“ audio / x-ms-wma”; 打破; (2认同)

Dmi*_*aev 23

❤️斯威夫特

extension Data {
    private static let mimeTypeSignatures: [UInt8 : String] = [
        0xFF : "image/jpeg",
        0x89 : "image/png",
        0x47 : "image/gif",
        0x49 : "image/tiff",
        0x4D : "image/tiff",
        0x25 : "application/pdf",
        0xD0 : "application/vnd",
        0x46 : "text/plain",
        ]

    var mimeType: String {
        var c: UInt8 = 0
        copyBytes(to: &c, count: 1)
        return Data.mimeTypeSignatures[c] ?? "application/octet-stream"
    }
}
Run Code Online (Sandbox Code Playgroud)


Tom*_*ton 4

既然您说要上传此数据,那么您应该已经知道 MIME 类型。您创建了数据对象,您知道数据来自哪里,并且 MIME 类型的数量有限。因此,请使用适用于您的数据的任何一种。对于图像来说,它可能是image/jpegimage/png。对于视频来说,有很多video/类型。您可以在 Mac 上的 中找到一长串 MIME 类型字符串/etc/apache2/mime.types。您需要其中一个或多个,具体取决于您拥有的视频类型。

确定 MIME 类型是一个棘手的问题;anNSData可以编码任何类型的二进制数据。确定编码内容的唯一方法是检查字节。这反过来意味着对不同文件类型中存在哪些字节流有一定的了解。在许多(但不是全部)情况下应该可以使用查找字典,并且在某些地方可能有针对常见文件类型的开源实现。要了解其中涉及的内容,请尝试man file在 Mac 上查看/usr/share/file/magic/如何识别各种文件类型(该file命令不会生成 MIME 类型,但会分析文件内容以尝试识别文件类型,因此原理相同)。