使用文件内容来确定节点JS的MIMEtypes
似乎所有stream行的node.js MIMEtypes库只是使用文件扩展名而不是窥探文件来确定MIMEtypes。
有没有一种好的方法来使用节点跳转到文件中,并智能确定文件的MIMEtypes,以防扩展名不存在?
这确实感觉可惜,最stream行的MIME模块只是将扩展映射到types。
经过深入的search,我发现这个模块叫做mmmagic ,它似乎正在做你想要的东西。
请注意,从MIME的工作,我留下了一个口味,原则上MIME检测不是完全可靠的,并有一个罕见的错误检测的机会。
使用示例(取自其网站):
var mmm = require('mmmagic'), Magic = mmm.Magic; var magic = new Magic(mmm.MAGIC_MIME_TYPE); magic.detectFile('node_modules/mmmagic/build/Release/magic.node', function(err, result) { if (err) throw err; console.log(result); // output on Windows with 32-bit node: // application/x-dosexec });
由于MIME完全不会规定文件内容格式,所以只能使用启发式方法来猜测文件中发生了什么:
-
一些二进制格式有一些叫做幻数的东西,但是这些格式可能是错误的或者是模棱两可的。 看到这个维基百科的文章了解更多信息。
-
许多文本文件格式都包含可用于简单模式匹配testing的语法结构。 例如
xml
,csv
或json
。 然而,某些格式(例如,HTML
)具有相当“演变”的语法定义,使得它不明确,因此很难模式匹配。
为了更好地说明歧义问题,下面是一个例子:浏览器开发了一个非常高的容忍度,接受任何远程类似于HTML
东西,因此HTML
(甚至XHTML
)文件格式很难识别。 更何况HTML
文件实际上可以是非HTML
模板语言( jade
, handlebars
, angular
模板等)。 这只是事情变得模糊的许多例子之一。