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 ())
Sehen Sie sich die Beispiele für ausführbare Go Playgrounds an.
Verwenden Sie Bibliotheken wie mimetype nur als letzten Ausweg. Die Erkennung von Inhaltstypen mithilfe magischer Zahlen ist langsam, ungenau und nicht standardisiert. In den meisten Fällen verfügen Protokolle über Methoden zur Angabe solcher Metadaten. z. B. Content-Type
Header in HTTP und SMTP.
F: Meine Datei steht in der Liste der unterstützten MIME-Typen, wird aber nicht richtig erkannt. Was soll ich tun?
A: Einige Dateiformate (häufig Microsoft Office-Dokumente) behalten ihre Signaturen am Ende der Datei. Versuchen Sie, die Anzahl der für die Erkennung verwendeten Bytes zu erhöhen, indem Sie Folgendes tun:
mimetype . SetLimit ( 1024 * 1024 ) // Set limit to 1MB.
// or
mimetype . SetLimit ( 0 ) // No limit, whole file content used.
mimetype . DetectFile ( "file.doc" )
Wenn die Erhöhung des Limits nicht hilft, öffnen Sie bitte ein Problem.
mimetype verwendet eine hierarchische Struktur, um die MIME-Typ-Erkennungslogik beizubehalten. Dies reduziert die Anzahl der Aufrufe, die zum Erkennen des Dateityps erforderlich sind. Der Grund für diese Wahl liegt darin, dass es Dateiformate gibt, die als Container für andere Dateiformate dienen. Beispielsweise sind Microsoft Office-Dateien nur ZIP-Archive, die bestimmte Metadatendateien enthalten. Sobald eine Datei als ZIP-Datei identifiziert wurde, muss nicht überprüft werden, ob es sich um eine Textdatei handelt. Es lohnt sich jedoch zu prüfen, ob es sich um eine Microsoft Office-Datei handelt.
Um zu verhindern, dass ganze Dateien in den Speicher geladen werden, beschränkt sich der Mimetyp bei der Erkennung von einem Lesegerät oder einer Datei darauf, nur den Header der Eingabe zu lesen.
Dank der hierarchischen Struktur, bei der zunächst nach gängigen Formaten gesucht wird und die sich auf Dateiheader beschränkt, erreicht mimetype die Leistung von stdlib http.DetectContentType
und übertrifft gleichzeitig das alternative Paket.
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
Siehe CONTRIBUTING.md.