Mime型检测正确完成

时间:2011-06-23 13:35:49

标签: language-agnostic mime-types

我目前面临的一个问题我发现不仅仅是有趣的:检测给定文件的mime类型。 通过检测,我的意思是尝试仅使用文件中存在的信息来猜测mime类型。通过文件,我的意思是一个具有名称和内容的结构。

以下是我对此问题所知的解决方案:

  • 尝试根据文件名猜测文件类型。例如,如果文件名是foo.txt,我可以假设mime类型是text/plain
  • 尝试使用内容确定类型,尤其是通常包含某种魔术代码的第一个字节。例如,如果文件以八位字节0xCAFEBABE开头,我可以假设mime类型为application/x-java-class

解决这个问题的两种方法有其优点和缺点。

第一种解决方案非常有效,但我们假设该文件具有正确的名称,并具有扩展名。如何检测名为LICENSEREADME

的文件的mime类型

第二种技术有点复杂,必须实际读取数据。它适用于包含魔术代码的所有文件,但对其他文件效果不佳。可能会出现一些问题:如何区分MS-DOS EXE文件(以MZ作为魔术代码开头)与以text/plain开头的实际MZ文件之间的区别。当您考虑其他文件类型(txt vs csv; html vs xml vs xhtml)时,会出现许多类似的问题。

所以这是真正的问题: 如何高效可靠地检测文件的mime类型?


一些旁注:

  • 我知道有很多很多的库可以帮助你完成工作。我对图书馆不感兴趣。我有兴趣弄脏手。
  • 没有特定的语言。我对通用算法很感兴趣,而不是具体的实现。

1 个答案:

答案 0 :(得分:1)

你的问题的答案可能只是“正则表达式”,因为你要求算法,而不是工具。实际上在文件中查找模式来猜测它肯定是确定它是什么的最好方法。如果有疑问,您也可以查看文件扩展名(如果可用),但不应该依赖它。例如,在UNIX系统上,OS在决定是否可以执行文件时不关心文件扩展名。因此,永远不应该依赖文件扩展名。

从算法的角度来看,任务本身是微不足道的:收集识别不同文件类型的正则表达式。但这是很多工作,对于你想要识别的每种文件类型,你需要熟悉它的设计才能真正能够编写一个真正识别文件类型的表达式,只有最少的误报和漏报

那么为什么要费心去解决其他人已经投入巨资的问题呢?您可能知道,最广泛的解决方案是UNIX工具file及其库libmagic,它可以轻松地在您的程序中使用。存在与最常见脚本语言的绑定。 file实用程序的“神奇”数据库可能是最全面的,了解您之前从未听说过的异国文件类型(因为它们已被广泛使用数年或数十年)并且已经过调整和现在已经固定很久了(现在已经38岁了。)