mimetype
v1.4.7
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等库作为最后的手段。使用幻数进行内容类型检测速度慢、不准确且不标准。大多数情况下,协议都有指定此类元数据的方法;例如,HTTP 和 SMTP 中的Content-Type
标头。
问:我的文件位于支持的 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。