从NSData确定MIME类型?

时间:2014-02-14 21:23:25

标签: ios objective-c mime-types nsdata

您如何确定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

6 个答案:

答案 0 :(得分:33)

基于ml's answer from a similar post,我添加了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;
}

夫特:

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

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

PS:所有相应的mime类型都可用here

答案 1 :(得分:21)

❤️Swift

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

答案 2 :(得分:3)

据我所知,NSData只是一个包装字节数组的数据对象:

https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSData_Class/Reference/Reference.html

...所以,如果你想发现它的MIME类型,我可以想到的一种方法是检查字节本身,然后从那里推测出类型。这里有一个例子:Finding image type from NSData or UIImage

我也发现了这个:Determine MIME Type of NSData Loaded From a File;这是指一些可用于MIME类型查找的内部数据库(我猜)。

但就像Tom Harrington在他的回答中所说的那样,根据你所处理的内容,这可能会变得棘手。

修改...

当然,第二个解决方案依赖于文件扩展名,你显然没有,但我相信你已经注意到了。

答案 3 :(得分:2)

由于您说上传此数据,您应该已经知道了MIME类型。您创建了数据对象,您知道数据的来源,并且MIME类型的数量有限。因此,请使用适用于您的数据的任何一种。对于图片,可能是image/jpegimage/png。对于视频,有一堆video/类型。您可以在/etc/apache2/mime.types的Mac上找到一长串MIME类型字符串。根据您拥有的视频类型,您需要一个或多个。

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

答案 4 :(得分:0)

var values = [UInt8](重复:0,计数:imgData.count)

imgData.copyBytes(to:& values,count:1)

    switch values {
    case 0xff:
        return "image/jpeg"
    case 0x89:
        return "image/png"
    case 0x47:
        return "image/gif"
    case 0x49, 0x4d:
        return "image/tiff"
    }

    return ""

答案 5 :(得分:0)

基于接受的答案的快速解决方案:

import Foundation

extension Data {
    var mimeType: String {
        var byte: UInt8 = 0
        copyBytes(to: &byte, count: 1)

        switch byte {
        case 0xFF:
            return "image/jpeg"
        case 0x89:
            return "image/png"
        case 0x47:
            return "image/gif"
        case 0x49, 0x4D :
            return "image/tiff"
        case 0x46:
            return "text/plain"
        case 0x25:
            return "application/pdf"
        case 0xD0:
            return "application/vnd"
        default:
            return "application/octet-stream"
        }
    }
}

用法:

data.mimeType