go get github.com/gabriel-vasile/mimetype
mtype := mimetype . Detect ([] byte )
// OR
mtype , err := mimetype . DetectReader ( io . Reader )
// OR
mtype , err := mimetype . DetectFile ( "/path/to/file" )
fmt . Println ( mtype . String (), mtype . Extension ())
Voir les exemples exécutables de Go Playground.
N'utilisez des bibliothèques comme MIMEType qu'en dernier recours. La détection du type de contenu à l'aide de nombres magiques est lente, inexacte et non standard. La plupart du temps, les protocoles disposent de méthodes pour spécifier ces métadonnées ; par exemple, en-tête Content-Type
dans HTTP et SMTP.
Q : Mon fichier figure dans la liste des types MIME pris en charge mais il n'est pas correctement détecté. Que dois-je faire?
R : Certains formats de fichiers (souvent des documents Microsoft Office) conservent leur signature vers la fin du fichier. Essayez d'augmenter le nombre d'octets utilisés pour la détection avec :
mimetype . SetLimit ( 1024 * 1024 ) // Set limit to 1MB.
// or
mimetype . SetLimit ( 0 ) // No limit, whole file content used.
mimetype . DetectFile ( "file.doc" )
Si l'augmentation de la limite ne résout pas le problème, veuillez ouvrir un ticket.
mimetype utilise une structure hiérarchique pour conserver la logique de détection de type MIME. Cela réduit le nombre d'appels nécessaires pour détecter le type de fichier. La raison derrière ce choix est qu'il existe des formats de fichiers utilisés comme conteneurs pour d'autres formats de fichiers. Par exemple, les fichiers Microsoft Office ne sont que des archives zip contenant des fichiers de métadonnées spécifiques. Une fois qu'un fichier a été identifié comme zip, il n'est pas nécessaire de vérifier s'il s'agit d'un fichier texte, mais cela vaut la peine de vérifier s'il s'agit d'un fichier Microsoft Office.
Pour éviter de charger des fichiers entiers en mémoire, lors de la détection à partir d'un lecteur ou d'un fichier MIME, il se limite à lire uniquement l'en-tête de l'entrée.
Grâce à la structure hiérarchique, recherchant d'abord les formats communs et se limitant aux en-têtes de fichiers, mimetype correspond aux performances de stdlib http.DetectContentType
tout en surpassant le package alternatif.
mimetype http.DetectContentType filetype
BenchmarkMatchTar-24 250 ns/op 400 ns/op 3778 ns/op
BenchmarkMatchZip-24 524 ns/op 351 ns/op 4884 ns/op
BenchmarkMatchJpeg-24 103 ns/op 228 ns/op 839 ns/op
BenchmarkMatchGif-24 139 ns/op 202 ns/op 751 ns/op
BenchmarkMatchPng-24 165 ns/op 221 ns/op 1176 ns/op
Voir CONTRIBUTION.md.