web-dev-qa-db-fra.com

Déterminer le type MIME à partir de NSData?

Comment détermineriez-vous le type mime d'un objet NSData? Je prévois que l'utilisateur télécharge une vidéo/une image à partir de son iPhone et que ce fichier soit encapsulé dans une classe NSData.

Je me demandais si je pouvais dire le type mime de NSData. Il n’ya que quelques réponses à cette question et la plus récente date de 2010 (il y a 4 ans!). Merci!

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

Sur la base de la réponse de ml d'un message similaire , j'ai ajouté la détermination des types mime pour NSData:

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

Rapide:

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

Cette poignée ne gère que les types de fichiers principaux, mais vous pouvez la compléter pour répondre à vos besoins: toutes les signatures de fichiers sont disponibles ici , utilisez le même motif que je l’ai fait.

PS: tous les types de mime correspondants sont disponibles ici

32
Tib

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

Autant que je sache, NSData est juste un objet de données qui enveloppe un tableau d'octets:

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

... Ainsi, si vous voulez découvrir son type MIME, je peux penser à inspecter les octets eux-mêmes, puis à en supposer le type. Voici un exemple de cela: Recherche du type d'image à partir de NSData ou UIImage

J'ai aussi trouvé ceci: Déterminer le type MIME de NSData chargé depuis un fichier ; qui fait référence à une base de données interne (je suppose) pouvant être utilisée pour une recherche de type MIME. 

Mais comme le dit Tom Harrington dans sa réponse, la situation pourrait être délicate en fonction de la situation.

Modifier...

Bien sûr, cette deuxième solution repose sur l’extension de fichier, que vous n’avez évidemment pas, mais je suis sûr que vous l’avez déjà remarqué. 

3
Manny

Puisque vous dites que vous uploadez ces données, vous devez déjà connaître le type MIME. Vous avez créé l'objet de données, vous savez d'où proviennent les données et le nombre de types MIME est limité. Utilisez donc celui qui s’applique à vos données. Pour une image, il s'agit probablement de image/jpeg ou image/png. Pour les vidéos, il existe une multitude de types video/. Vous trouverez une longue liste de chaînes de type MIME sur votre Mac dans /etc/Apache2/mime.types. Vous en voudrez une ou plusieurs selon le type de vidéo que vous avez.

Déterminer le type MIME est un problème épineux. un NSData peut encoder tout type de données binaires. Le seul moyen de déterminer ce qui a été codé est d'examiner les octets. Cela implique à son tour de bien comprendre quels flux d'octets existent dans différents types de fichiers. Il devrait être possible d'utiliser un dictionnaire de recherche dans de nombreux cas (mais pas tous), et il pourrait y avoir une implémentation open source quelque part pour les types de fichiers courants. Pour avoir une idée de ce que cela implique, essayez man file sur votre Mac et regardez dans /usr/share/file/magic/ pour voir comment divers types de fichiers sont identifiés (la commande file ne produit pas les types MIME, mais elle analyse le contenu des fichiers pour tenter d'identifier les types de fichiers. le même principe).

2
Tom Harrington

valeurs var = [UInt8] (répétant: 0, compte: 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 ""
0
Urvish Modi