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 ())
Vea los ejemplos ejecutables de Go Playground.
Utilice bibliotecas como mimetype únicamente como último recurso. La detección del tipo de contenido mediante números mágicos es lenta, inexacta y no estándar. La mayoría de las veces los protocolos tienen métodos para especificar dichos metadatos; por ejemplo, encabezado Content-Type
en HTTP y SMTP.
P: Mi archivo está en la lista de tipos MIME admitidos pero no se detecta correctamente. ¿Qué tengo que hacer?
R: Algunos formatos de archivo (a menudo documentos de Microsoft Office) mantienen sus firmas hacia el final del archivo. Intente aumentar la cantidad de bytes utilizados para la detección con:
mimetype . SetLimit ( 1024 * 1024 ) // Set limit to 1MB.
// or
mimetype . SetLimit ( 0 ) // No limit, whole file content used.
mimetype . DetectFile ( "file.doc" )
Si aumentar el límite no ayuda, abra un problema.
mimetype utiliza una estructura jerárquica para mantener la lógica de detección de tipos MIME. Esto reduce la cantidad de llamadas necesarias para detectar el tipo de archivo. La razón detrás de esta elección es que existen formatos de archivo que se utilizan como contenedores para otros formatos de archivo. Por ejemplo, los archivos de Microsoft Office son simplemente archivos zip que contienen archivos de metadatos específicos. Una vez que un archivo ha sido identificado como zip, no es necesario verificar si es un archivo de texto, pero vale la pena verificar si es un archivo de Microsoft Office.
Para evitar cargar archivos completos en la memoria, al detectar desde un lector o desde un archivo el tipo mime se limita a leer solo el encabezado de la entrada.
Gracias a la estructura jerárquica, buscando primero formatos comunes y limitándose a los encabezados de archivos, mimetype iguala el rendimiento de stdlib http.DetectContentType
y supera al paquete alternativo.
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
Consulte CONTRIBUCIÓN.md.