【发布时间】:2014-08-31 00:38:19
【问题描述】:
似乎所有流行的 node.js MIME 类型库都只是使用文件扩展名而不是查看文件来确定 MIME 类型。
有没有什么好的方法可以使用 Node 跳转到文件中,并在不存在扩展名的情况下智能地确定文件的 MIME 类型?
【问题讨论】:
标签: javascript node.js file mime-types
似乎所有流行的 node.js MIME 类型库都只是使用文件扩展名而不是查看文件来确定 MIME 类型。
有没有什么好的方法可以使用 Node 跳转到文件中,并在不存在扩展名的情况下智能地确定文件的 MIME 类型?
【问题讨论】:
标签: javascript node.js file mime-types
这确实有点遗憾,最流行的 MIME 模块只是将扩展映射到类型。
经过深入搜索,我找到了名为mmmagic的模块,它似乎正在做你想要的。
请注意,在使用 MIME 时,我有一种感觉,MIME 检测原则上并不完全可靠,而且极少有可能出现错误检测。
使用示例(取自their站点):
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 根本没有规定任何关于文件内容格式的内容,因此您只能使用启发式方法来猜测文件中发生了什么:
一些二进制格式有一个叫做幻数的东西,但它们可能是错误的或模棱两可的。 See this wikipedia article 了解更多信息。
许多文本文件格式都包含可用于简单模式匹配测试的语法结构。例如。 xml、csv 或 json。然而,某些格式(例如HTML)具有相当“进化”的语法定义,使其模棱两可,因此难以进行模式匹配。
为了更好地说明歧义的问题,这里有一个例子:浏览器已经开发出非常高的容忍度,并且接受任何与HTML 很相似的东西,因此HTML(甚至XHTML)文件格式很难来识别。更不用说HTML 文件实际上可能是非HTML 模板语言(例如jade、handlebars、angular 模板等)。这只是事情变得非常模棱两可的众多示例之一。
【讨论】: