Contents

文件MIME类型简介

1. 概述

MIME 类型是 Web 技术中的一个重要主题。

在本教程中,我们将讨论 MIME 类型是什么,并学习如何使用 Linux 命令行实用程序获取文件的 MIME 类型。

2. MIME 类型

**缩写MIME 代表多用途 Internet 邮件扩展。**MIME 类型形成了一种在 Internet 上对文件类型进行分类的标准方法。

首先,我们以一个常见的 MIME 类型为例:

text/html

MIME 类型由两部分组成:类型和子类型。

在这个例子中,类型是“ text ”,子类型是“ html ”。

目前有十种注册类型:applicationaudioexamplefontimagemessagemodelmultiparttextvideo

让我们看看其他一些常见的 MIME 类型:

multipart/form-data
text/xml
text/csv
text/plain
application/xml
application/zip
application/pdf

在 MIME 类型中,类型和子类型不区分大小写。

子类型通常由媒体格式组成,例如上例中的“ xml ”或“ pdf ”。但是,它也可以包含其他内容,例如树前缀或后缀,具体取决于注册树中的不同规则。

完整的 MIME 类型格式如下所示:

type "/" [tree "."] subtype ["+" suffix]

让我们看另一个MIME 类型示例:

application/vnd.api+json

这是一种特定于 API 的 MIME 类型,它指的是JSON API

在此示例中,我们将“ application ”作为类型,将“ api ”作为子类型。“vnd.”是厂商前缀,“ +json ”是后缀,表示可以解析为JSON。

3. 确定文件的 MIME 类型

MIME 类型提供了一种命名类型的标准方法。但是,文件的 MIME 类型不存储在 Linux 文件系统上。

有两种方法可以确定文件的 MIME 类型:

  • 查看文件扩展名
  • 查看文件内容

接下来,我们来看看两种判断文件MIME类型的方法。

3.1. 按文件扩展名

MIME 类型有时可以由扩展名确定,但并非总是如此。

如果文件没有扩展名或扩展名不正确,我们无法通过文件扩展名确定 MIME 类型。例如,我们可以重命名 JPG 图像文件,使其具有 ZIP 文件扩展名。

3.2. 按文件内容

获取文件 MIME 类型的另一种方法是读取其内容。

我们可以根据文件内容的具体特征来确定MIME类型。例如,JPG 以十六进制签名 FF D8 开头,以 FF D9 结尾。 由于额外的 I/O 工作,这比文件扩展方法慢。但是,它可以更可靠。

3.3. 结合两种方式

在现实世界中,程序经常结合使用这两种方法来确定文件的 MIME 类型。例如,freedesktop.org的 shared-mime-info 维护一个 MIME 类型的数据库,并允许其他程序,例如GNOMEKDEXfce ,使用该数据库通过文件扩展名或内容查找相应的 MIME 类型。

让我们看一个在 shared-mime-info 中定义的 MIME 类型“ image/png ”的示例:

<?xml version="1.0" encoding="UTF-8"?>
<mime-info xmlns="http://www.freedesktop.org/standards/shared-mime-info">
    <mime-type type="image/png">
        <comment xml:lang="en">PNG image</comment>
        <comment xml:lang="af">png beeld</comment>
        ...
        <magic priority="50">
            <match type="string" value="\x89PNG" offset="0"/>
        </magic>
        <glob pattern="*.png"/>
    </mime-type>
</mime-info>

在上面的“ image/png ”示例中,magic标签定义了通过内容识别 PNG 文件的规则。但是,glob标记定义文件扩展名以确定 MIME 类型。

4. Linux 命令行工具

现在,让我们看看如何使用 Linux 命令行工具获取文件的 MIME 类型。在本节中,我们将看到两个实用程序:file 命令和xdg-mime 命令。

4.1. xdg -mime命令

xdg-mime命令是来自 freedesktop.org的*xdg-utils *包的 成员。几乎所有带有桌面环境的 Linux 发行版都预装了这个软件包。

xdg-mime命令使用 shared-mime-info 数据库来确定 MIME 类型。它将首先尝试通过文件扩展名识别 MIME 类型。如果失败,它将查看文件的内容。

使用xdg-mime命令获取文件的 MIME 类型的语法是:

xdg-mime query filetype INPUT_FILE

让我们准备一个 JPG 图片文件(onePicture.jpg),看看xdg-mime命令是否可以获取 MIME 类型:

$ xdg-mime query filetype onePicture.jpg
image/jpeg

接下来,让我们用xdg-mime命令玩一个小技巧。让我们更改文件扩展名,看看xdg-mime命令会给我们什么结果:

$ mv onePicture.jpg onePicture.zip
$ xdg-mime query filetype onePicture.zip
application/zip

哎呀!xdg-mime命令告诉我们一个错误的 MIME 类型。 这是因为xdg-mime命令首先尝试在数据库中按文件扩展名查找 MIME 类型。

现在,让我们完全删除文件扩展名,看看会发生什么:

$ mv onePicture.zip onePicture
$ xdg-mime query filetype onePicture
image/jpeg

我们再次得到正确的结果。这是因为如果xdg-mime命令无法通过文件扩展名找到 MIME 类型,它将尝试通过文件内容查找 MIME 类型。

4.2. file命令

大多数免费操作系统,例如 FreeBSD 和 Linux,默认都带有file命令。我们将使用带有选项*–mime-type*的命令来获取文件的 MIME 类型。

我们看看file命令能否获取到同一个JPG文件的MIME类型:

$ file --mime-type onePicture.jpg
onePicture.jpg: image/jpeg

现在,让我们对文件扩展名进行相同的更改,看看文件是否仍然可以报告正确的结果:

$ mv onePicture.jpg onePicture.zip
$ file --mime-type onePicture.zip
onePicture.zip: image/jpeg

伟大的!即使我们试图通过更改文件扩展名来欺骗file命令,它仍然可以分辨出正确的 MIME 类型。**这是因为file命令不依赖文件扩展名来确定文件 MIME 类型。相反,它会查看实际的文件内容。**因此,在这种情况下更可靠。

最后,我们删除文件扩展名,希望 file命令仍然可以正常工作:

$ mv onePicture.zip onePicture
$ file --mime-type onePicture
onePicture: image/jpeg

正如我们所料,它再次给出了正确的结果。