使用NodeJS检查文件内容确定MIME类型

9

在node.js中,所有流行的MIME类型库似乎都仅使用文件名扩展名来确定MIME类型,而不是查看文件内容。

如果文件没有扩展名,有没有好的方法可以使用Node跳转到文件并智能地确定文件的MIME类型?

2个回答

10

确实感觉很遗憾,大多数流行的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
  });

Multer、Formidable、mime-types、file-type 根据扩展名返回文件类型。对于同一个文件,当我更改扩展名时,将获得另一种 mime 类型。只有 mmmagic 真正起作用! - Văn Quyết

3

MIME并没有对文件内容格式做出任何规定,因此只能使用启发式方法来猜测文件的内容:

  1. 一些二进制格式有所谓的魔数(magic number),但这可能是错误或有歧义的。请参阅维基百科文章获得更多信息。

  2. 许多文本文件格式包含语法结构,可以用于简单的模式匹配测试。例如:xmlcsvjson。但是一些格式(例如HTML)具有相当“演化”的语法定义,使其具有歧义性,因此很难进行模式匹配。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接