web-dev-qa-db-de.com

MIME-Typ aus NSData ermitteln?

Wie würden Sie den Mime-Typ für ein NSData-Objekt bestimmen? Ich möchte, dass der Benutzer ein Video/Bild von seinem iPhone hochlädt und diese Datei in eine NSData-Klasse verpackt.

Ich habe mich gefragt, ob ich den Mime-Typ von den NSData unterscheiden kann. Es gibt nur wenige Antworten auf diese Frage und die letzte stammt aus dem Jahr 2010 (vor 4 Jahren!). Vielen Dank!

NSData *data; // can be an image or video
NSString *mimeType = [data getMimetype]; // how would I implement getMimeType
18
blee908

Basierend auf mls Antwort aus einem ähnlichen Post , habe ich die Mime-Typen-Bestimmung für NSData hinzugefügt:

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

Schnell:

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

Dabei werden nur die Hauptdateitypen behandelt. Sie können sie jedoch entsprechend Ihren Anforderungen vervollständigen: Alle Dateisignaturen sind verfügbar hier verwenden Sie einfach das gleiche Muster wie ich.

PS: alle entsprechenden Mime-Typen sind verfügbar hier

32
Tib

❤️ schnell

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"
    }
}
20
Dmitry Isaev

Soweit ich weiß, ist NSData nur ein Datenobjekt, das ein Byte-Array umschließt:

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

... Eine Möglichkeit, die ich mir vorstellen kann, wenn Sie den MIME-Typ herausfinden möchten, besteht darin, die Bytes selbst zu überprüfen und dann den Typ von dort aus zu vermuten. Hier ein Beispiel: Bildtyp von NSData oder UIImage finden

Ich habe auch folgendes gefunden: Bestimmt den MIME-Typ der aus einer Datei geladenen NSData ; Dies bezieht sich auf eine interne Datenbank (ich denke mal), die für einen MIME-Typ-Lookup verwendet werden kann. 

Aber wie Tom Harrington in seiner Antwort sagt, könnte es schwierig werden, je nachdem, mit was Sie es zu tun haben.

Bearbeiten ...

Natürlich hängt diese zweite Lösung von der Dateierweiterung ab, die Sie offensichtlich nicht haben, aber ich bin sicher, dass Sie das bereits bemerkt haben. 

3
Manny

Da Sie sagen, dass Sie diese Daten hochladen, sollten Sie den MIME-Typ bereits kennen. Sie haben das Datenobjekt erstellt, Sie wissen, woher die Daten stammen, und es gibt eine begrenzte Anzahl von MIME-Typen. Verwenden Sie also das, was für Ihre Daten gilt. Für ein Bild ist es wahrscheinlich image/jpeg oder image/png. Für Videos gibt es eine Reihe von video/-Typen. Sie finden eine lange Liste von MIME-Typzeichenfolgen auf Ihrem Mac in /etc/Apache2/mime.types. Je nachdem, welche Art von Video Sie haben, benötigen Sie eine oder mehrere davon.

Die Bestimmung des MIME-Typs ist ein klebriges Problem. Ein NSData kann jede Art von Binärdaten kodieren. Die einzige Möglichkeit zu bestimmen, was codiert wurde, ist das Untersuchen der Bytes. Dies bedeutet wiederum, dass Sie wissen, welche Byte-Streams in verschiedenen Dateitypen vorhanden sind. In vielen (aber nicht allen) Fällen sollte es möglich sein, ein Nachschlagewörterbuch zu verwenden, und es könnte irgendwo eine Open-Source-Implementierung für gängige Dateitypen geben. Um eine Vorstellung davon zu bekommen, was auf dem Mac zum Einsatz kommt, probieren Sie man file auf Ihrem Mac und schauen Sie in /usr/share/file/magic/ nach, wie verschiedene Dateitypen identifiziert werden (der Befehl file erzeugt keine MIME-Typen, analysiert jedoch den Dateiinhalt, um Dateitypen zu ermitteln das gleiche Prinzip).

2
Tom Harrington

var values ​​= [UInt8] (Wiederholung: 0, Anzahl: imgData.count)

imgData.copyBytes (bis: & Werte, Anzahl: 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 ""
0
Urvish Modi