什么是MIME Type

MIME Type是用于描述文件的类型的一种表述方法,其将文件划分为多种类型,方便对其进行统一的管理。

MIME Type指定了文件的类型名称、描述、图标信息,同时通过与.desktop应用程序描述文件整合,指定了文件的打开方式。

MIME type是被file manager使用,而不是Gnome或者Ubuntu系统本身。

以GIMP的.desktop为例说明:

[Desktop Entry]

Version=1.0

Type=Application

Name=GNU Image Manipulation Program

GenericName=Image Editor

Comment=Create images and edit photographs

Exec=gimp-2.7 %U

TryExec=gimp-2.7

Icon=gimp

Terminal=false

Categories=Graphics;2DGraphics;RasterGraphics;GTK;

X-GNOME-Bugzilla-Bugzilla=GNOME

X-GNOME-Bugzilla-Product=GIMP

X-GNOME-Bugzilla-Component=General

X-GNOME-Bugzilla-Version=2.7.2

X-GNOME-Bugzilla-OtherBinaries=gimp-2.7

StartupNotify=true

MimeType=application/postscript;application/pdf;image/bmp;image/g3fax;image/gif;image/x-fits;image/pcx;image/x-portable-anymap;image/x-portable-bitmap;image/x-portable-graymap;image/x-portable-pixmap;image/x-psd;image/x-sgi;image/x-tga;image/x-xbitmap;image/x-xwindowdump;image/x-xcf;image/x-compressed-xcf;image/tiff;image/jpeg;image/x-psp;image/png;image/x-icon;image/x-xpixmap;image/svg+xml;application/pdf;image/x-wmf;image/jp2;image/jpeg2000;image/jpx;image/x-xcursor;

MimeType字段说明了这个程序支持的MIME types

Exec字段说明了程序的打开方式,Exec字段最后的%U或%f很重要,其决定了这个程序时候能显示在文件管理器的open with清单中。

谁来决定MIME type的默认程序

mime文件类型描述文件,定义了每个MIME type的特征参数,以及每个何种类型的文件归属到这个MIME下

.desktop应用程序描述文件,说明了程序的打开方式,也指定了其支持的MIME type

mimeinfo.cache 通过抓取.desktop文件的MIME字段信息,将上述两种描述文件合二为一,形成一个查询数据库,每个MIME type文件打开时,将通过这个文件寻找打开程序。

如果一个MIME type对应到多个.desktop应用程序描述文件,通过抓取而来的mimeinfo.cache并不能决定谁更优先,因为多个.desktop文件之间并没有优先级定义。面对这个场景,最终的默认程序是由mimeapps.list文件定夺的,其由用户人工配置,决定同一个MIME type对应多个.desktop程序时,哪个程序优先级更高,更高优先级的程序即是族中的默认程序。mimeapps.list在系统中有多个路径存在,每个路径的优先级是不同的,修改时需要注意。

Freedesktop标准化

在旧时代,KDE和GNOME各自为政,为了在不同的Desktop Manager上统一应用程序打开方法,Freedesktop.org组织定义了多个标准规范,以实现应用的统一管理:

Shared MIME database文件类型描述数据库,这个数据库描述了每一个文件类型(MIME type)的参数特征(名称、、别名、描述、图标),以及满足何种条件才能将其划分到对应的MIME类别。

MIME type描述文件,位于/usr/share/mime/packages/(.xml),其每一个文件类型(MIME type)的参数特征(名称、、别名、描述、图标),以及满足何种条件才能将其划分到对应的MIME类别。

单独索引每个MIME type描述文件是非常不高效的,所以Freedesktop引入了Shared MIME database,其是一个静态数据库(文本文件/usr/share/mime/mime.cache 此cache文件不建议用户修改,可以通过修改上述静态数据库,并通过update-mime-database /usr/share/mime/命令更新cache文件),描述了每个MIME type的特征。初期的数据整合了早期KDE和GNOME的文件类型描述信息,并逐步更新。

用户可以自定义自己描述的MIME type描述文件到/usr/share/mime/packages/(.xml),并通过update-mime-database /usr/share/mime/ 命令更新到数据库文件中。

Desktop Entry specification应用程序描述文件(.desktop),这个文件描述了系统上安装的应用程序的参数特征(名称、启动方法、图标、支持的MIME type)。这个描述文件除了用于打开程序外本身、打开MIME type文件的关联程序,还负责提供给Desktop Manager构建应用程序Menu和索引)

mime-apps-spec-1.0关联MIME type和application,标准规定了一个文件可以默认被哪个应用程序(上述Desktop Entry specification定义)打开、如何修改默认打开程序、如何增加删除MIME type与application的关联。

每个应用程序描述文件虽然已经指定了各自支持的MIME type,但是如果每次文件打开前都去遍历一边所有的描述文件,执行效率将会非常低下。所以就需要一个关联数据库,负责将application(应用程序描述文件)与MIME type(Shared MIME Database)对应起来。这个数据库是一个文本文件静态数据库(/usr/share/applications/mimeinfo.cache 此cache文件不建议用户修改,可以通过修改每个单独的.desktop文件,并通过update-desktop-database /usr/share/mime/命令更新数据库)。

用户可以自定义应用程序的打开方式到/usr/share/appliacaions(.desktop),并通过update-desktop-database /usr/share/applications/命令更新到数据库中。

文件默认打开程序优先级

参考URL:https://wiki.debian.org/MIME (最终改变了作者对mimeapps.list和mimeinfo.cache的关系的认识,以及整个MIME体系的认识)

update-desktop-database程序通过从每个.desktop文件中抓取其关联的MIME type,并形成mime type与application关联数据库,但是因为是抓取的方式获得的关联关系,如果一个mime type对应有多个application(.desktop),则mimeinfo.cache数据库是不能分辨出优先级的。

这时就需要另一个与mimeinfo.cache数据库格式相似的文件mimeapps.list,其负责指定每个mime type在发生多程序关联时,哪个程序优先级高,mimeapps.list在系统中有多个路径存在,见下表(文件优先级自高到底):

Path

Usage

$XDG_CONFIG_HOME/$desktop-mimeapps.list

user overrides, desktop-specific (for advanced users)

$XDG_CONFIG_HOME/mimeapps.list

user overrides (recommended location for user configuration GUIs)

$XDG_CONFIG_DIRS/$desktop-mimeapps.list

sysadmin and ISV overrides, desktop-specific

$XDG_CONFIG_DIRS/mimeapps.list

sysadmin and ISV overrides

$XDG_DATA_HOME/applications/$desktop-mimeapps.list

for completeness, deprecated, desktop-specific

$XDG_DATA_HOME/applications/mimeapps.list

for compatibility, deprecated

$XDG_DATA_DIRS/applications/$desktop-mimeapps.list

distribution-provided defaults, desktop-specific

$XDG_DATA_DIRS/applications/mimeapps.list

distribution-provided defaults

注意1:mimeapps.list的前身是defaults.list,但是已经被废弃不用了。参考URL:https://wiki.archlinux.org/index.php/Default_applications

注意2:如果修改了mimeapps.list文件,且更新了数据库缓存,但是依旧不生效,就需要看一下修改的文件的优先级,有没有更高级别的文件覆盖了你的操作。

作者一开始没有搞清楚整个工作模式时,是使用strace跟踪nautilus才发现的这个问题。

查看文件的MIME type及其该MIME关联的application打开方式:

ray@ray-ThinkPad-X250:~/Desktop$ mimetype topo-WLAN.graphml

topo-WLAN.graphml: application/yed

ray@ray-ThinkPad-X250:~/Desktop$ gvfs-mime --query application/yed

Default application for 'application/yed': yEd.desktop

Registered applications:

yEd.desktop

Recommended applications:

yEd.desktop

ray@ray-ThinkPad-X250:~/Desktop$

不建议使用xdg-mime query filetype命令查看MIME打开方式,其通过/usr/share/mime/目录下的文件决定输出内容,如果mime-type是通过alias定义的,没有实际的文件,则查找失败。

gvfs-mime虽然也是读取/usr/share/mime目录下的文件,但是它可以识别出alias,虽然有时候也是不准确!!!

自定义MIME TYPE,并指定打开程序

自定义MIME TYPE

icon 自定义:

http://techmonks.net/how-to-add-a-custom-filetype-to-linux/

https://help.ubuntu.com/community/AddingMimeTypes

https://wiki.archlinux.org/index.php/Icons

Linux 的icons也分为很多种类,专门的icon theme都会分类到指定的icon类别(不同的目录),mimetypes也是专门的目录。

用户自己创建的mimetypes icons存放在~/.local/share/icons目录的子目录mimetypes下:

ray@ray-ThinkPad-X250:~/.local/share/icons$ ls -al ~/.local/share/icons/hicolor/32x32/mimetypes/

total 12

drwx------ 2 ray ray 4096 Feb 28 12:32 .

drwx------ 4 ray ray 4096 Feb 28 12:32 ..

lrwxrwxrwx 1 ray ray 7 Feb 28 12:32 gnome-mime-yEd.png -> yEd.png

-rw------- 1 ray ray 1922 Feb 28 12:32 yEd.png

ray@ray-ThinkPad-X250:~/.local/share/icons$ ls -al ~/.local/share/icons/hicolor/32x32/apps

total 12

drwx------ 2 ray ray 4096 Feb 26 16:30 .

drwx------ 4 ray ray 4096 Feb 28 12:32 ..

-rw------- 1 ray ray 1350 Feb 26 16:30 chrome-coobgpohoikkiipiblmjeljniedjpjpf-Default.png

ray@ray-ThinkPad-X250:~/.local/share/icons$

配置自定义mime icon步骤如下:

寻找一个png文件,并确定其尺寸大小。(文件属性可以看到)

不用复制文件到上述mimetypes icon目录,使用如下命令实现:

xdg-icon-resource install --size 32 --context mimetypes yEd.png

更新MIME数据库

sudo update-mime-database /usr/share/mime

配置.desktop文件关联MIME TYPE

ray@ray-ThinkPad-X250:~/.local/share/applications$ sudo vim ~/.local/share/applications/yED.desktop

#!/usr/bin/env xdg-open

[Desktop Entry]

Type=Application

Name=yEd Graph Editor

Exec=/bin/sh "/home/ray/Applications/yEd/yEd" %f

Icon=/home/ray/Applications/yEd/.install4j/yEd.png

Categories=Player;

MimeType=application/yed;

更新.desktop文件与MIME TYPE关联数据库

$ update-desktop-database ~/.local/share/applications

image.png

image.png

thunderbird下的MIME

通过strace可以发现Thunderbird调用了/etc/mailcap和/etc/mime.types文件(有限调用用户目录下的~/.mimetypes文件)决定文件的打开方式,这两个文件是通过update-mime命令更新维护的,区别与前边的update-mime-database。

正常情况下thunderbird与系统文件系统的标准MIME配置是一样的,可以正确的识别文件的MIME类型并对应打开程序。

但是thunderbird的MIME类型判断不完全是通过扩展名来检测的,thunderbird使用邮件系统的正文(源代码)指定的MIME类型和附件的扩展名联合来寻找关联的application,正常情况下也是没有问题的,但是。。。。。。总有一些不守规矩的邮件内容(尤其是一些垃圾第三方邮件客户端),会指定错误的MIME类型,比如将xls和xlsx混淆关联,所以将会导致thunderbird判断不出文件的MIME类型,进而无法提供默认的application,所以会经常看到默认的gedit程序总是被“宠幸”作为last backup。

目前还没有找到好的办法解决这个问题,随后再研究吧。

2016.08.03 找到两个之前版本靠谱的Thunderbird Add-on:

OPENATTACHMENTBYEXTENSION

根据文件扩展名来选择打开的程序,可以解决Thunderbird下的问题,但是最新版本测试结果是中文文件打开还是有问题,charset设备为gb2312也是不可以的。

Gnome Open或OpenX

要求DM必须是GNOME,通过调用gnome-open程序让Nautilus来判断文件类型,并选择合适的打开方式。它会生成一个新的MIME分类到thunderbird,名字是"application/gnomeopen",强制指定通过/usr/bin/gnome-open程序打开。再通过插件Overlay的方式替换掉thunderbird处理附件的JS脚本,修改脚本打开附件的方法固定使用"applicaiton/gnomeopen"这个MIME。测试结果是已经失效,应该是JS脚本因为版本升级发生了变化,自己尝试修改也未果。

最终的可用的方法是,通过Gnome Open插件带来的灵感,在unknow文件打开时,选择打开方式为/usr/bin/gnome-open,简化操作。

linux 添加mime类型,Linux MIME type相关推荐

  1. linux 添加宋体字符集,Linux下安装中文宋体

    1,#cd /usr/share/fonts/default 2,mkdir -p ./truetype/simsun 3,取得simsun.ttc文件:如果网上下载不到则在windows (c:/w ...

  2. iis php的mime类型,IIS MIME类型介绍、MIME大全

    MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型.是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器 ...

  3. linux添加hello驱动,Linux驱动之建立一个hello模块

    目标:在开发板上执行insmod hello.ko能在控制台打印出hello init:接着执行rmmod会在控制台打印出hello exit 建立一个hello模块的步骤如下: 1.建立一个hell ...

  4. linux添加windows网络打印机,Linux Mint如何添加windows分享的网络打印机?

    1.安装samba sudo apt-get install samba 2.找到系统打印机选项 通过 Menu-->>控制中心-->>系统管理找到 Printers选项,双击 ...

  5. 嵌入式linux添加环境变量,Linux环境变量

    前言: 1. 环境变量是操作系统环境设置的变量,适用于整个系统的用户进程: 2. 环境变量可以在命令中设置,但是用户注销的时候将会丢失这些设置值: 3. 若要重复适用,则最好在.profile中定义: ...

  6. linux添加qcc,Alpine Linux添加Let’s Encrypt CA证书或者自签CA证书

    Alpine Linux添加Let's Encrypt CA证书或者自签CA证书 1. 用docker进行查看 进入容器, docker run -it alpine:latest /bin/sh 安 ...

  7. 【Mime类型】mime.json

    方式1: 使用npm mime模块 npm mime模块 TODO 使用示例 方式2:自己定义方法和mime.json 封装一个方法获取mime类型的方法 const fs = require('fs ...

  8. linux添加硬盘30g,linux添加新硬盘 - 橙子柠檬's Blog

    1.查看新添加的硬盘[root@gitlab-server ~]# fdisk -l 磁盘 /dev/sdb:107.4 GB, 107374182400 字节,209715200 个扇区 Units ...

  9. linux 软硬文件类型,linux文件属性和类型、系统链接文件、软链接和硬链接

    文件属性和类型 [[email protected] ~]# ll -d wzh d rwxr-xr-x. 2 root root 6 Mar 26 06:27 wzh 目录 ,权限 硬链接数 属主 ...

最新文章

  1. python项目开发实战网盘-《Python项目案例开发从入门到实战》PDF版百度网盘
  2. php 一致性hash,【转载】memcache分布式 [一致性hash算法] 的php实现
  3. JMeter学习笔记--JMeter监听器
  4. 汇编语言王爽第二版-课后答案以及解析
  5. 温州大学《机器学习》课程课件(六、KNN算法)
  6. 字节,腾讯,百度... Go 工程师面试题大公开
  7. Linux源码编译安装程序
  8. 当面试官问我————为什么String是final的?
  9. Kafka生产者源码解析
  10. npm包的语义版本控制(Semantic Versioning of Packages)
  11. 烂泥:CentOS6.5光盘以及ISO镜像文件的使用
  12. 【转】javascript判断浏览器是不是IE
  13. Android开发中Ant命令编译和APK签名的一些心得
  14. 文本聚类分析算法_集成聚类系列(三)图聚类算法详解
  15. 计算机组成原理罗克露课后答案,计算机组成原理[完整版](罗克露)(全)原版教案.ppt...
  16. 沃尔玛承压,TJX、唯品会稳健,折扣零售是行业“抗压”能手?
  17. 写在1024,致程序员致程序员节致自己
  18. Java实现 蓝桥杯 算法训练 删除数组零元素
  19. 小米MAX3 线刷兼救砖_解账户锁_纯净刷机包_教程
  20. 量子点、量子点发光、量子点屏幕究竟是什么?

热门文章

  1. 网页重构面试题(整理)
  2. drwtsn32.exe 遇到问题需要关闭。我们对此引起的不便表示抱歉
  3. Service Unavailable 问题
  4. 刷脸支付现骗局,创业投资需谨慎
  5. findbugs 接口文档_Findbugs安装使用文档
  6. String StringBuffer StringBuilder区别与联系
  7. 视频剪辑,有色彩视频批量去色的简单操作
  8. 软件测试常见笔试题总结
  9. IE设置允许活动内容在我的计算机上的文件中运行
  10. Convolutional Networks for Voting-based Anomaly Classification in Metal Surface Inspection-论文阅读笔记