跳转到内容

文件类型检测

file-type.js 通过解析文件分析魔数获取文件类型。

大多数情况下,我们都是通过扩展名来识别一个文件的类型的,比如我们看到一个.txt 结尾的文件我们就知道他是一个纯文本文件。但是,扩展名是可以修改的,那一旦一个文件的扩展名被修改过,那么怎么识别一个文件的类型呢。这就用到了我们提到的 “魔数”。

当然,不仅仅是我们用户,Windows 系统也是基于后缀名解析文件。但我们把没有后缀名的文件发送到 mac 系统中,mac 系统却可以使用正确的应用程序打开文件。

单单解释魔数本身,就是指在代码中,出现一些没有注释的数字常量或者字符串,很可能在过一段时间之后谁也不知道这个常量或者字符串代表什么意思。我们就称这个常量或者字符串为魔数 (magic number)。

在不同文件中,其起始的几个字节的内容是固定的(或是有意填充,或是本就如此)。因此这几个字节的内容也被称为魔数 ,因为根据这几个字节的内容就可以确定文件类型。有了这些魔术数字,我们就可以很方便的区别不同的文件。

而 java 中 .class 文件的魔数就是 0xCAFEBABE (咖啡宝贝),只有这种数字才会被 java 虚拟机接受 (当然还有版本号检查)。

在业务项目中,用户上传的文件可能是用户恶意篡改的病毒文件,所以为了避免这种情况,我们需要对文件的后缀名进行过滤。通过对后缀名的判断只能够简单的验证文件,如果用户恶意更改了文件的后缀名,这种判断就不起作用了。所以我们还需要对文件的内容进行验证。