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
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
❤️ 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"
}
}
Autant que je sache, NSData
est juste un objet de données qui enveloppe un tableau d'octets:
... 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é.
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).
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 ""