写点什么

Media Type 媒体类型(MIME Type、Content Type)

作者:AlexLei
  • 2023-09-26
    广东
  • 本文字数:1376 字

    阅读完需:约 5 分钟

媒体类型用于声明随之而来的数据的格式。又称:MIME 类型、MIME Type、Content Type。 是一种用于在异构系统、网络之间传递信息时声明其格式的方法。


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


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

标准形式: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)

学习资料


2022 年 11 月 10 日 第二次修订

2023 年 09 月 26 日 第三次修订

发布于: 刚刚阅读数: 4
用户头像

AlexLei

关注

还未添加个人签名 2023-09-22 加入

还未添加个人简介

评论

发布
暂无评论
Media Type 媒体类型(MIME Type、Content Type)_MIME_AlexLei_InfoQ写作社区