计算机世界的“身份证”-MIME类型

引言

在我的nixos上,一直存在着这样的问题:我的终端(xdg-open)和我的文件管理器(Thunar)无法找到打开的默认程序,经过一番查找,我发现可以这样配制MIMEapp,又了解到了强大的MIME类型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
{ pkgs, ... }: {
xdg.mimeApps = {
enable = true;
defaultApplications = {
# --- Web ---
"text/html" = "firefox.desktop";
"x-scheme-handler/http" = "firefox.desktop";
"x-scheme-handler/https" = "firefox.desktop";
"x-scheme-handler/about" = "firefox.desktop";
"x-scheme-handler/unknown" = "firefox.desktop";

# --- PDF ---
"application/pdf" = "org.gnome.Evince.desktop";

# --- Word,PPT,Excel ---
# Word (.doc, .docx)
"application/msword" = "libreoffice-writer.desktop";
"application/vnd.openxmlformats-officedocument.wordprocessingml.document" = "libreoffice-writer.desktop";

# Excel (.xls, .xlsx)
"application/vnd.ms-excel" = "libreoffice-calc.desktop";
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" = "libreoffice-calc.desktop";

# PowerPoint (.ppt, .pptx)
"application/vnd.ms-powerpoint" = "libreoffice-impress.desktop";
"application/vnd.openxmlformats-officedocument.presentationml.presentation" = "libreoffice-impress.desktop";

# --- Picture ---
"image/jpeg" = "viewnior.desktop"; # JPG, JPEG
"image/png" = "viewnior.desktop"; # PNG
"image/gif" = "viewnior.desktop"; # GIF
"image/bmp" = "viewnior.desktop"; # BMP
"image/tiff" = "viewnior.desktop"; # TIFF
"image/webp" = "viewnior.desktop"; # WebP

# --- Video ---
"video/mp4" = "mpv.desktop";
"video/mpv" = "mpv.desktop";
"video/mkv" = "mpv.desktop";
"video/webm" = "mpv.desktop";
"video/avi" = "mpv.desktop";

# --- Audio ---
"audio/mpeg" = "mpv.desktop";
"audio/flac" = "mpv.desktop";
"audio/wav" = "mpv.desktop";
"audio/mp3" = "mpv.desktop";
};
};

}

MIME 类型剖析:type/subtype 结构

一个标准的 MIME 类型由两部分组成,中间用斜杠 / 分隔,结构简洁明了:

type/subtype

  1. Type(主类型): 定义了数据的大类。常见的 Type 有:

    • text:人类可读的文本信息。
    • image:图像文件。
    • audio:音频文件。
    • video:视频文件。
    • application:应用程序或二进制数据,涵盖许多其他类型无法明确归类的文件。
    • multipart:由多个独立部分组成的数据体,常见于文件上传或邮件。
    • message:封装的邮件消息。
  2. Subtype(子类型): 在主类型下进一步细分具体的格式。

    • 例如,text 下可能有 plain (纯文本), html, css, csv
    • image 下可能有 jpeg, png, gif, svg+xml
    • application 下可能有 pdf, json, xml, zip, javascript (比 text/javascript 更推荐)。

可选参数:锦上添花

有时,MIME 类型后面还会跟着一个或多个用分号 ; 分隔的参数,提供额外信息。最常见的是 charset 参数,用于指定文本数据的字符编码:

  • text/html; charset=UTF-8:表示这是一个使用 UTF-8 编码的 HTML 文档。

另一个常见参数是 boundary,在 multipart/form-data 类型中用于分隔表单提交的不同数据部分。

常见 MIME 类型一览

  • 文本: text/plain, text/html, text/css
  • 图片: image/jpeg, image/png, image/gif, image/svg+xml, image/webp
  • 音频: audio/mpeg (MP3), audio/ogg, audio/wav
  • 视频: video/mp4, video/webm, video/ogg
  • 应用程序: application/pdf, application/json, application/xml, application/zip, application/octet-stream (通用二进制), application/javascript, application/vnd.openxmlformats-officedocument.wordprocessingml.document (.docx)

应用

Web

在万维网(WWW)上,MIME 类型的作用至关重要。当你通过浏览器访问一个网址时:

  1. Web 服务器在返回请求的资源(HTML、图片、CSS 等)时,会在 HTTP 响应头中包含一个 Content-Type 字段,其值就是该资源的 MIME 类型。
  2. 浏览器读取这个 Content-Type 值,就像查看“内容身份证”,从而知道如何处理接收到的数据:
    • text/html:解析为 HTML,渲染成网页。
    • image/jpeg:显示为 JPEG 图片。
    • application/pdf:调用 PDF 阅读器插件或提示下载。
    • application/octet-stream:通常表示未知或需下载的二进制文件,提示用户保存。

可以说,没有 MIME 类型,浏览器将无法正确区分和处理五花八门网络资源,我们丰富多彩的网页浏览体验也将不复存在。

那么,Web 服务器如何确定要发送的 MIME 类型呢?

  • 服务器配置: 大多数服务器(如 Apache, Nginx)会根据文件的扩展名进行映射(例如,.html -> text/html, .jpg -> image/jpeg)。
  • 后端应用程序: 对于动态生成的内容(如 PHP, Python, Node.js 生成的响应),应用程序可以在代码中显式设置 Content-Type 头。

Linux桌面

MIME 类型不仅在网络世界大放异彩,在现代 Linux 桌面环境(如 GNOME, KDE, XFCE 等遵循 Freedesktop.org 标准的环境)中同样是核心基础。当你双击文件或使用 xdg-open 命令时,正是 MIME 机制在驱动着这一切。

工作原理:三步走

Linux 桌面通过 xdg-utils 等工具,遵循 Freedesktop.org 的规范,按以下步骤处理文件:

第一步:识别文件类型 (Shared MIME-info Database)
  • 系统首先需要确定文件的 MIME 类型。它会查询位于 /usr/share/mime/ 等处的 Shared MIME-info Database
  • 识别依据:
    1. 文件扩展名 (Filename Extension):.txt -> text/plain
    2. 魔术数字 (Magic Numbers): 检查文件开头的特定字节序列,如 PDF 的 %PDF
  • 你可以手动查询:
1
2
3
xdg-mime query filetype ysyx-exp.pdf

application/pdf
第二步:关联应用程序 (mimeapps.list.desktop 文件)
  • 知道了 MIME 类型(如 application/pdf),系统需要查找哪个应用程序是处理该类型的默认或可选应用
  • 关联信息存储在 mimeapps.list 文件中(用户配置 ~/.config/mimeapps.list 优先级更高,然后是系统配置 /usr/share/applications/mimeapps.list 等)。
  • 这些列表将 MIME 类型映射到应用程序的 .desktop 文件(位于 /usr/share/applications/~/.local/share/applications/)。.desktop 文件包含了启动应用程序所需的信息(名称、命令、图标等)。
  • 你可以查询和设置默认应用:
1
2
3
4
5
6
7
# 查询 PDF 的默认应用
xdg-mime query default application/pdf

org.gnome.Evince.desktop

# 将 Okular 设为 PDF 的默认应用
xdg-mime default org.kde.okular.desktop application/pdf
第三步:启动应用程序 (xdg-open)
  • 当你执行打开操作(双击或 xdg-open)时:
    1. 确定文件 MIME 类型。
    2. 查找关联的默认 .desktop 文件。
    3. 读取 .desktop 文件中的执行命令。
    4. 执行命令,并将文件路径作为参数传递给应用程序。

超越文件打开:图标与右键菜单

文件管理器(如 Nautilus, Dolphin)也利用 MIME 类型来:

  • 显示正确的图标: 根据 MIME 类型匹配图标主题中的图标。
  • 构建右键菜单: “打开方式”列表会显示所有声明能处理该 MIME 类型的应用程序。

计算机世界的“身份证”-MIME类型
https://20040702.xyz/2025/04/25/MIME/
作者
Seeker
发布于
2025年4月25日
许可协议