我目前正面临一个我觉得比有趣的问题:检测给定文件的MIME类型。 通过检测,我的意思是只使用文件中存在的信息来猜测MIME类型。通过文件,我的意思是一个具有名称和内容的结构。Mime类型检测完成正确
这里是我知道这个问题的解决方案:
- 试图猜测根据文件名的文件类型。例如,如果文件名是
foo.txt
,我可以假设MIME类型是text/plain
- 尝试使用内容确定类型,特别是通常包含某种魔术代码的第一个字节。例如,如果文件以八位组号
0xCAFEBABE
开头,那么我可以假设MIME类型是application/x-java-class
。
这个问题的两种解决方法都有其优点和缺点。
第一个解决方案非常高效,但我们假设该文件具有正确的名称,并且具有扩展名。如何检测名为LICENSE
或README
的文件的MIME类型?
第二种技术有点复杂,必须实际读取数据。它适用于所有包含魔术代码的文件,但对其他文件效果不佳。可能会出现一些问题:如何区分MS-DOS EXE文件(以MZ
作为魔术代码开始)和以字母MZ
开头的实际text/plain
文件之间的区别。当您考虑其他文件类型(txt
vs csv
; html
vs xml
vs xhtml
)时,许多类似的问题出现了。
因此,真正的问题来了: 如何有效和可靠地检测MIME类型的文件?
一些旁注:
- 我知道很多很多图书馆的存在在那里,做的工作。我对图书馆不感兴趣。我有兴趣弄脏我的手。
- 无特殊语言。我对通用算法感兴趣,而不是特定的实现。
当然,最好的方法是将这些信息与数据一起存储。 OS X使用[UTI](http://en.wikipedia.org/wiki/Uniform_Type_Identifier)执行此操作。但我认为这没有帮助? – You