在node.js中,所有流行的MIME类型库似乎都仅使用文件名扩展名来确定MIME类型,而不是查看文件内容。
如果文件没有扩展名,有没有好的方法可以使用Node跳转到文件并智能地确定文件的MIME类型?
在node.js中,所有流行的MIME类型库似乎都仅使用文件名扩展名来确定MIME类型,而不是查看文件内容。
如果文件没有扩展名,有没有好的方法可以使用Node跳转到文件并智能地确定文件的MIME类型?
确实感觉很遗憾,大多数流行的MIME模块只是将扩展名映射到类型。
深入搜索后,我发现了一个叫做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并没有对文件内容格式做出任何规定,因此只能使用启发式方法来猜测文件的内容:
一些二进制格式有所谓的魔数(magic number),但这可能是错误或有歧义的。请参阅维基百科文章获得更多信息。
许多文本文件格式包含语法结构,可以用于简单的模式匹配测试。例如:xml
、csv
或json
。但是一些格式(例如HTML
)具有相当“演化”的语法定义,使其具有歧义性,因此很难进行模式匹配。
为了更好地说明歧义问题,这里举个例子:浏览器已经发展出非常高的容忍度,接受任何类似于HTML
的东西,因此很难识别HTML
(甚至是XHTML
)文件格式。更不用说HTML
文件实际上可以是非HTML
模板语言(例如jade
、handlebars
、angular
模板等)。这只是许多例子中的一个,其中事情变得非常模糊。