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 ())
См. примеры запуска Go Playground.
Используйте такие библиотеки, как mimetype , только в крайнем случае. Определение типа контента с помощью магических чисел происходит медленно, неточно и нестандартно. В большинстве случаев протоколы имеют методы для указания таких метаданных; например, заголовок Content-Type
в HTTP и SMTP.
Вопрос: Мой файл есть в списке поддерживаемых типов MIME, но он распознается неправильно. Что я должен делать?
О: Некоторые форматы файлов (часто документы Microsoft Office) сохраняют свои подписи ближе к концу файла. Попробуйте увеличить количество байтов, используемых для обнаружения, с помощью:
mimetype . SetLimit ( 1024 * 1024 ) // Set limit to 1MB.
// or
mimetype . SetLimit ( 0 ) // No limit, whole file content used.
mimetype . DetectFile ( "file.doc" )
Если увеличение лимита не помогло, пожалуйста, откройте проблему.
mimetype использует иерархическую структуру для сохранения логики определения типа MIME. Это уменьшает количество вызовов, необходимых для определения типа файла. Причина этого выбора заключается в том, что существуют форматы файлов, используемые в качестве контейнеров для других форматов файлов. Например, файлы Microsoft Office — это просто zip-архивы, содержащие определенные файлы метаданных. Если файл идентифицирован как zip-архив, нет необходимости проверять, является ли он текстовым файлом, однако стоит проверить, является ли это файлом Microsoft Office.
Чтобы предотвратить загрузку целых файлов в память, при обнаружении из ридера или из файла mimetype ограничивается чтением только заголовка ввода.
Благодаря иерархической структуре, которая сначала ищет общие форматы и ограничивается заголовками файлов, mimetype соответствует производительности stdlib http.DetectContentType
но превосходит альтернативный пакет.
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
См. CONTRIBUTING.md.