我目前面临的一个问题我发现不仅仅是有趣的:检测给定文件的mime类型。 通过检测,我的意思是尝试仅使用文件中存在的信息来猜测mime类型。通过文件,我的意思是一个具有名称和内容的结构。
以下是我对此问题所知的解决方案:
foo.txt
,我可以假设mime类型是text/plain
0xCAFEBABE
开头,我可以假设mime类型为application/x-java-class
。解决这个问题的两种方法有其优点和缺点。
第一种解决方案非常有效,但我们假设该文件具有正确的名称,并具有扩展名。如何检测名为LICENSE
或README
?
第二种技术有点复杂,必须实际读取数据。它适用于包含魔术代码的所有文件,但对其他文件效果不佳。可能会出现一些问题:如何区分MS-DOS EXE文件(以MZ
作为魔术代码开头)与以text/plain
开头的实际MZ
文件之间的区别。当您考虑其他文件类型(txt
vs csv
; html
vs xml
vs xhtml
)时,会出现许多类似的问题。
所以这是真正的问题: 如何高效可靠地检测文件的mime类型?
一些旁注:
答案 0 :(得分:1)
你的问题的答案可能只是“正则表达式”,因为你要求算法,而不是工具。实际上在文件中查找模式来猜测它肯定是确定它是什么的最好方法。如果有疑问,您也可以查看文件扩展名(如果可用),但不应该依赖它。例如,在UNIX系统上,OS在决定是否可以执行文件时不关心文件扩展名。因此,永远不应该依赖文件扩展名。
从算法的角度来看,任务本身是微不足道的:收集识别不同文件类型的正则表达式。但这是很多工作,对于你想要识别的每种文件类型,你需要熟悉它的设计才能真正能够编写一个真正识别文件类型的表达式,只有最少的误报和漏报
那么为什么要费心去解决其他人已经投入巨资的问题呢?您可能知道,最广泛的解决方案是UNIX工具file及其库libmagic
,它可以轻松地在您的程序中使用。存在与最常见脚本语言的绑定。 file
实用程序的“神奇”数据库可能是最全面的,了解您之前从未听说过的异国文件类型(因为它们已被广泛使用数年或数十年)并且已经过调整和现在已经固定很久了(现在已经38岁了。)