gabriel-vasile/mimetype
GitHub: gabriel-vasile/mimetype
一个基于 magic numbers 的 Go 语言库,用于快速、准确地检测文件的 MIME 类型和扩展名。
Stars: 1996 | Forks: 195
mimetype
一个基于 magic numbers 检测 MIME 类型和扩展名的包
Goroutine 安全,可扩展,无 C 绑定
## 功能 - 快速且精确的 MIME 类型和文件扩展名检测 - 庞大的[支持的 MIME 类型](supported_mimes.md)列表 - 可以使用其他文件格式进行[扩展](https://pkg.go.dev/github.com/gabriel-vasile/mimetype#example-package-Extend) - 优先处理常见的文件格式 - [文本与二进制文件的区分](https://pkg.go.dev/github.com/gabriel-vasile/mimetype#example-package-TextVsBinary) - 无外部依赖 - 适用于并发场景,线程安全 ## 安装 ``` 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 示例](https://pkg.go.dev/github.com/gabriel-vasile/mimetype#pkg-overview)。 注意:请仅在万不得已时才使用像 **mimetype** 这样的库。使用 magic numbers 进行内容类型检测速度慢、不准确且非标准。大多数情况下,协议都有指定此类元数据的方法;例如,HTTP 和 SMTP 中的 `Content-Type` 标头。 ## 常见问题解答 问:我的文件在[支持的 MIME 类型](supported_mimes.md)列表中,但是没有被正确检测到。我该怎么办? 答:某些文件格式(通常是 Microsoft Office 文档)将它们的签名保留在文件的末尾。尝试通过以下方式增加用于检测的字节数: ``` mimetype.SetLimit(1024*1024) // Set limit to 1MB. // or mimetype.SetLimit(0) // No limit, whole file content used. mimetype.DetectFile("file.doc") ``` 如果增加限制没有帮助,请[提交一个 issue](https://github.com/gabriel-vasile/mimetype/issues/new?assignees=&labels=&template=mismatched-mime-type-detected.md&title=)。 ## 测试 除了单元测试之外,[mimetype_tests](https://github.com/gabriel-vasile/mimetype_tests) 还将该库与 [libmagic](https://en.wikipedia.org/wiki/File_(command) 针对 5 万个左右的样本文件进行了对比。在[此处](https://github.com/gabriel-vasile/mimetype_tests/actions)查看最新的对比结果。 ## 性能测试 提交 PR 时会进行性能测试。结果可以在[工作流页面](https://github.com/gabriel-vasile/mimetype/actions/workflows/benchmark.yml)上查看。 欢迎提升性能,但优先考虑准确性。 ## 结构 **mimetype** 使用分层结构来维护 MIME 类型检测逻辑。这减少了检测文件类型所需的调用次数。这样选择的原因是,有些文件格式被用作其他文件格式的容器。例如,Microsoft Office 文件只是 zip 压缩包,其中包含特定的元数据文件。一旦文件被识别为 zip 压缩包,就没有必要检查它是否是文本文件,但值得检查它是否是 Microsoft Office 文件。 为了防止将整个文件加载到内存中,当从 [reader](https://pkg.go.dev/github.com/gabriel-vasile/mimetype#DetectReader) 或 [file](https://pkg.go.dev/github.com/gabriel-vasile/mimetype#DetectFile) 进行检测时,**mimetype** 会将自身限制为仅读取输入的标头。
标签:EVTX分析, Go, MIME类型检测, Ruby工具, 开发库, 文件处理, 文件格式识别, 日志审计