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 ())
Veja os exemplos executáveis do Go Playground.
Use bibliotecas como mimetype apenas como último recurso. A detecção do tipo de conteúdo usando números mágicos é lenta, imprecisa e fora do padrão. Na maioria das vezes, os protocolos possuem métodos para especificar tais metadados; por exemplo, cabeçalho Content-Type
em HTTP e SMTP.
P: Meu arquivo está na lista de tipos MIME suportados, mas não foi detectado corretamente. O que devo fazer?
R: Alguns formatos de arquivo (geralmente documentos do Microsoft Office) mantêm suas assinaturas no final do arquivo. Tente aumentar o número de bytes usados para detecção com:
mimetype . SetLimit ( 1024 * 1024 ) // Set limit to 1MB.
// or
mimetype . SetLimit ( 0 ) // No limit, whole file content used.
mimetype . DetectFile ( "file.doc" )
Se aumentar o limite não ajudar, abra um problema.
mimetype usa uma estrutura hierárquica para manter a lógica de detecção do tipo MIME. Isto reduz o número de chamadas necessárias para detectar o tipo de arquivo. A razão por trás dessa escolha é que existem formatos de arquivo usados como contêineres para outros formatos de arquivo. Por exemplo, os arquivos do Microsoft Office são apenas arquivos zip, contendo arquivos de metadados específicos. Depois que um arquivo for identificado como zip, não há necessidade de verificar se é um arquivo de texto, mas vale a pena verificar se é um arquivo do Microsoft Office.
Para evitar o carregamento de arquivos inteiros na memória, ao detectar de um leitor ou de um arquivo, o tipo MIME limita-se a ler apenas o cabeçalho da entrada.
Graças à estrutura hierárquica, procurando primeiro por formatos comuns e limitando-se aos cabeçalhos de arquivo, o mimetype corresponde ao desempenho do stdlib http.DetectContentType
enquanto supera o pacote 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 CONTRIBUTING.md.