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

如何在Golang中检测其他mime类型,go,mime-types,detection,Go,Mime Types,Detection,在net/http包中有http.DetectContentType([]字节)函数。但只支持有限数量的类型。如何添加对docx,doc,xls,xlsx,ppt,pps,odt,odp文件的支持,不是按扩展名,而是按内容。 据我所知,存在一些问题,因为docx/xlsx/pptx/odp/odt文件与zip文件(50 4B 03 04)具有相同的签名。对于末尾带有x的文件,相对容易检测到。只需解压缩它并读取.rels/\u rels文件。它包含文档中主文件的路径。它由名称空间http://sc

net/http
包中有
http.DetectContentType([]字节)
函数。但只支持有限数量的类型。如何添加对
docx
doc
xls
xlsx
ppt
pps
odt
odp
文件的支持,不是按扩展名,而是按内容。
据我所知,存在一些问题,因为
docx
/
xlsx
/
pptx
/
odp
/
odt
文件与
zip
文件(50 4B 03 04)具有相同的签名。

对于末尾带有
x
的文件,相对容易检测到。只需解压缩它并读取
.rels/\u rels
文件。它包含文档中主文件的路径。它由名称空间
http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument
。查一下它的名字。docx是
document.xml
,xlsx是
workbook.xml
,pptx是
presentation.xml

更多信息可以在这里找到

二进制格式更难检测。基本上,您需要读取文件系统并检查条目:

  • WordDocument
    用于文档
  • xls的
    工作簿
    书籍
  • PowerPoint文档
    用于ppt
  • EncryptedPackage
    表示文件已加密

目前无法扩展
http。DetectContentType
,因为它使用了一个固定的、未报告的“嗅探器”片段:(
sniffSignatures
在撰写本文时位于第49行)

此外,我快速浏览了godoc.org以寻找更好的包,但没有找到任何可扩展和面向内容的包

我的建议是:在Go的内容嗅探器实现(如下)的指导下,构建自己的包


编辑:如果你愿意使用CGO,并且你在nix上,你可以使用libmagic绑定,例如。

我发现了,我发现这比使用CGO更好,因为它不使用CGO。但是magicmime在区分application/zip和office文件类型方面做得更好。

免责声明:我是

对于3年后出现相同问题的任何人,现在基于内容的mime类型检测包如下所示:

    • 纯go,没有c绑定
    • 可以扩展以检测新的mime类型
    • 对于作为多个mime类型传递的文件(例如:xlsx和docx作为zip传递)存在问题,因为它在映射中存储匹配函数,因此不能保证遍历顺序
    • 检测到的mime类型数量有限
    • 需要安装libmagic dev吗
    • 在这三种类型中,它检测到的mime类型数量最多
    • 可以扩展,尽管更难<代码>魔术师
    • libmagic不是线程安全的
    • 纯go,没有c绑定
    • 检测到的mime类型数高于
      filetype
    • 线程安全吗
    • 可以扩展

@salvadodali mime软件包很有用,但这个问题特别提出了基于内容而不是扩展的检测。关于如何开始这个问题,有什么提示吗?