如何在Golang中检测其他mime类型

时间:2015-04-24 03:24:30

标签: go mime-types detection

http.DetectContentType([]byte)包中有net/http个功能。但是仅支持有限数量的类型。如何添加docxdocxlsxlsxpptppsodt,{{1}的支持},ods文件不是扩展名,而是内容。 据我所知,存在一些问题,因为odp / docx / xlsx / pptx / odp文件与{odt具有相同的签名1}}文件(50 4B 03 04)。

4 个答案:

答案 0 :(得分:2)

对于末尾x的文件,相对容易检测。只需将其解压缩并阅读.rels/_rels文件即可。它包含文档中主文件的路径。它由名称空间http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument表示。只需检查它的名字。 docx为document.xml,xlsx为workbook.xml,pptx为presentation.xml

此处可以找到更多信息ECMA-376

二进制格式难以检测。基本上,您需要阅读MS-CFB文件系统并检查条目:

  • WordDocument for doc
  • WorkbookBook for xls
  • PowerPoint Document for ppt
  • EncryptedPackage表示文件已加密。

答案 1 :(得分:1)

目前无法扩展http.DetectContentType,因为它使用固定的,未导出的"嗅探器":https://golang.org/src/net/http/sniff.gosniffSignatures在第49行在撰写本文时)。

此外,我通过godoc.org快速查找了一个更好的软件包,但没有找到任何可扩展和面向内容的软件包。

我的建议是:在Go的内容嗅探器实现(https://mimesniff.spec.whatwg.org/之后)的指导下构建自己的包。

编辑:如果您愿意使用CGO并且您使用的是nix,则可以使用libmagic绑定,例如https://github.com/jteeuwen/magic

答案 2 :(得分:1)

我找到mimemagic,我觉得它更适合magicmime,因为它不使用cgo。但magicmime更擅长区分应用程序/ zip和office文件类型。

答案 3 :(得分:1)

免责声明:我是mimetype的作者。

对于3年后遇到相同问题的任何人,如今基于内容的用于mime类型检测的软件包如下:

  • filetype

    • 纯粹,没有c绑定
    • 可以扩展到检测新的mime类型
    • 对于以超过一种mime类型传递的文件(例如,xlsx和docx以zip传递)存在问题,因为它在地图中存储了匹配函数,因此不能保证遍历的顺序
  • magicmime

    • 需要安装libmagic-dev
    • 可以扩展,尽管更难... man magic
  • mimetype

    • 纯粹,没有c绑定
    • 可以扩展为检测新的mime类型
    • 检测到的较小的mime类型集