如何检测 MIME

如何检测 MIME

我搜索过四周但似乎找不到有关该主题的任何信息。

如何为现有文件设置 MIME 类型?

例如,我试图创建一个类型为text/html

答案1

MIME 类型实际上并不存储在文件系统中。它们只是了解如何处理文件的一种方便方式。要获取 MIME 类型,您必须运行一个程序。

有些程序会通过查看文件扩展名来检测文件的 mime 类型,而其他程序则会检查文件是否神奇数字或特殊魔法图案(本质上正则表达式)。


举例来说,运行touch test.html,它将创建一个空文件。

然后运行xdg-mime query filetype test.htmlmimetype test.html。它们都将返回类型text/html

但是,如果你运行file --mime-type -b test.html,它将返回inode/x-empty


因此,如果您希望所有程序以相同的方式对文件进行操作,则文件应该具有正确的格式(数据)以及正确的扩展名。

什么是神奇数字?

在我的个人资料图片上运行xxd image | head -1将产生如下输出:

00000000: 8950 4e47 0d0a 1a0a 0000 000d 4948 4452 .PNG........IHDR

根据 维基百科89 50 4E 47 0D 0A 1A 0A是所有文件的标准标题image/png

文件命令如何工作?

来自file(1)手册页:

有三组测试按以下顺序执行:文件系统测试、魔术测试和语言测试。...

文件系统测试基于检查stat(2)系统调用。程序检查文件是否为空,或者是否是某种特殊文件。...

魔术测试用于检查具有特定固定格式数据的文件。...这些文件在文件开头附近的特定位置存储了一个“魔术数字”,该数字告诉 UNIX 操作系统该文件是二进制可执行文件,以及是其中的哪一种类型。...如果文件与魔术文件中的任何条目都不匹配,则检查它是否看起来像文本文件。...

任何无法识别为以列出的任何字符集写入的文件……都将被简单地称为“数据”。

文件如何知道要使用什么魔法模式?

再次,从file(1)手册页:

识别这些文件的信息是从编译后的魔法文件 中读取的,如果编译后的文件不存在,/usr/share/misc/magic.mgc则从目录中的文件读取。此外,如果或存在,将优先于系统魔法文件使用它。如果 /etc/magic 存在,它将与其他魔法文件一起使用。/usr/share/misc/magic$HOME/.magic.mgc$HOME/.magic

如果我运行,strace file image |& grep magic我们可以看到该file命令查找这些文件:

/usr/lib/x86_64-linux-gnu/libmagic.so.1 =>libmagic(3) ~/.magic.mgc
~/.magic
/etc/magic.mgc
/etc/magic
/usr/share/misc/magic.mgc

还有其他文件,例如/etc/mime.types其他程序使用的。此文件将扩展名分配给 mime 类型。例如,grep -i text/html /etc/mime.types生成:

text/html                   html htm shtml

相关内容