使用文件内容来确定节点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完全不会规定文件内容格式,所以只能使用启发式方法来猜测文件中发生了什么:

  1. 一些二进制格式有一些叫做幻数的东西,但是这些格式可能是错误的或者是模棱两可的。 看到这个维基百科的文章了解更多信息。

  2. 许多文本文件格式都包含可用于简单模式匹配testing的语法结构。 例如xmlcsvjson 。 然而,某些格式(例如, HTML )具有相当“演变”的语法定义,使得它不明确,因此很难模式匹配。

为了更好地说明歧义问题,下面是一个例子:浏览器开发了一个非常高的容忍度,接受任何远程类似于HTML东西,因此HTML (甚至XHTML )文件格式很难识别。 更何况HTML文件实际上可以是非HTML模板语言( jadehandlebarsangular模板等)。 这只是事情变得模糊的许多例子之一。