HTML之MIME type

什么是MIME type

MIME type的缩写为(Multipurpose Internet Mail Extensions)代表互联网媒体类型(Internet media type),MIME使用一个简单的字符串组成,最初是为了标识邮件Email附件的类型,在html文件中可以使用content-type属性表示,描述了文件类型的互联网标准。 是一种用于在异构系统、网络之间传递信息时时声明其格式的方法。

MIME类型能包含视频、图像、文本、音频、应用程序等数据。

一般的,在文件系统中,我们会使用扩展名来表示文件类型,例如:.exe 表示可执行文件、.txt表示纯文本文件、.png表示png编码的图片、.mp4表示mp4视频。这种方法,在独立系统中运行的很好,但在网络传输中不是一个好的方法。首先扩展名并不权威,不同系统之间是有歧义的。其次扩展名的惯例是采用缩写的方式,不能准确表意。

为了便于在网络中准确描述与传递内容的类型声明,多方组织制定出媒体类型表示方法和注册规程 (Media Type Specifications and Registration Procedures :rfc6838)。 这种方法最初用于电子邮件(MIME)的,故也称之为 MIME Type。

一般情况下,可以不用设置type属性,浏览器会自动识别内容格式。不同浏览器支持的MIME类型有所不同,如果浏览器不支持某个MIME类型,会有不支持插件内容的提示。

MIME的作用

使客户端软件,区分不同种类的数据,例如web浏览器就是通过MIME类型来判断文件是GIF图片,还是可打印的PostScript文件。

web服务器使用MIME来说明发送数据的种类, web客户端使用MIME来说明希望接收到的数据种类。

标准形式:T1/T2

Media Type 的类型声明由2部分组成:大类/子类。 在册大类有10个,经常用到的大类 有6个:textimageaudiovideoapplicationmultipart。而子类就太多了,总计有近2000+种。

复合类型

multipart大类指复合类型。表示随后的数据是由多个不同媒体类型的信息块组成,每个块可以有单独的media type声明。

例如,在传附件,web中常见的multipart/form-data,可以用来上每个附件的媒体类型都可以不一样。再如,电子邮件中可以传不同类型的附件,邮件也是 multipart

结构后缀

对子类型要注意一点,子类声明时可以附加结构说明后缀(Structured Syntax Name Suffixes,rfc6838 4.2.8)。例如:application/soap+xml 表示W3C Web Service报文,报文采用xml语法;application/calendar+xml 表示采用xml语法承载的icalendar报文;application/calendar+json表示用json语法承载的icalendar报文。

通配符

要注意的是,media type 并不仅表示唯一确定类型。在网络协商时,media type支持传递通配符。*/*表示任意类型,text/*表示文本大类。因此,在程序中不能简单对mime type进行字符串比较。你需要考虑通配符的场景。

参数

在实际传递媒体类型时,可以在媒体类型后面附加参数: 大类/子类;参数1=值1;......;参数n=值n。例如:text/plain;charset=utf-8;bom=no

注册一个类型

IANA(互联网数字分配机构),承担 media type的注册管理。

在子类型的管理上,IANA目前设置有四个序列(Tree):1. 标准化(Standards Tree),2. 供应商(Vendor Tree),3. 个人用途(Personal or Vanity Tree),4. 未注册(Unregistered x. Tree)。

举例:

  1. text/plain
  2. application/vnd.openxmlformats-officedocument.wordprocessingml.document
  3. application/prs.xsf+xml
  4. application/x.abc 随意起的

注:历史上,有过用x-开头表示未注册的子类型的情况,后来改用 x.了。application/x-www-form-urlencoded 是一个正式类型。

小结

看到这儿你会发现对于处理 http报文头中的content-type,不能简单按照字符等于来判断,也不能简单将字符串用/来分割成大类子类。一个完整的mime type解析要能正确识别大类、子类、结构后缀、通配符、参数。 你可以参考:org.springframework.util.MimeTypeUtils.parseMimeTypeInternal(String)javax.activation.MimeType.MimeType(String)

学习资料

相关推荐
阿巴~阿巴~1 小时前
Linux 第一个系统程序 - 进度条
linux·服务器·bash
小白爱电脑1 小时前
什么是2.5G交换机?
运维·网络·5g·千兆宽带
?ccc?1 小时前
容器技术技术入门与 Docker 环境部署
运维·docker·容器
时时刻刻看着自己的心1 小时前
docker启动报错
运维·docker·容器
我科绝伦(Huanhuan Zhou)2 小时前
华为泰山服务器重启后出现 XFS 文件系统磁盘“不识别”(无法挂载或访问),但挂载点目录仍在且无数据
运维·服务器·华为
匆匆那年9672 小时前
Docker容器中安装MongoDB,导入数据
运维·docker·容器
望获linux2 小时前
【Linux基础知识系列】第四十三篇 - 基础正则表达式与 grep/sed
linux·运维·服务器·开发语言·前端·操作系统·嵌入式软件
万米商云3 小时前
企业物资集采平台解决方案:跨地域、多仓库、百部门——大型企业如何用一套系统管好百万级物资?
大数据·运维·人工智能
挑战者6668883 小时前
CentOS 系统高效部署 Dify 全攻略
linux·运维·centos
网硕互联的小客服5 小时前
服务器经常出现蓝屏是什么原因导致的?如何排查和修复?
运维·服务器·stm32·单片机·网络安全