如何在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的
或工作簿
书籍
用于pptPowerPoint文档
表示文件已加密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
- 线程安全吗
- 可以扩展