在回顾JavaScript的时候看到MIME类型,由于开始没怎么关注 charset属性,所以对这个类型也不怎么了解,查了资料过后在这里记录一下,顺便分享出来。
1.来自百度百科的混乱概念
当我在谷歌浏览器中搜索MIME类型关键字的时候,百度百科弹了出来,它对这个词的解释是这样的
MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型。是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。
当你一如既往地相信这个解释的时候,建议您看看知乎上的这篇文章[https://www.zhihu.com/question/60495696/answer/204530120]
他是这样说的:
照这句话的意思,我们有个jpg扩展名的图片文件,它的MIME类型也应该叫jpg。在访问这张图片时,浏览器自己不显示,用系统的相册应用程序来打开……你见过这种操作吗?
(如果MIME叫exe,难道还能不经同意直接在我们电脑上运行病毒不成)
是不是还是有点乱?
没关系,乱的一点原因就是解释MIME概念的时候引入了文件扩展名,虽然这是必要的,但也容易混乱。我们不妨回顾早些的历史,来看看到底从哪里开始混乱了。
2.回顾历史得到答案
什么是文件扩展名?
简单来说,文件扩展名就是早期操作系统用来标志文件格式的一种机制。例如一个完整的文件名,“girlFriend.txt”,girlFriend文件主名,txt就是扩展名,表示这个文件是一个纯文字文件,句号“.”就是文件主名与文件扩展名的分隔符号。
这种格式仅仅为了标志,而非强制定义。
所以,当你双击"girlFriend.txt"时,系统默认用记事本打开了文件。
如果你改文件名为“girlFriend.psd”,它默认被pdf的阅读器打开,只不过会报文件格式错误。
这说命了改变文件扩展名时,仅仅改变了文件的默认打开方式,并没有改变文件内容和格式。
什么是MIME类型?
所谓MIME,是一个互联网标准,MIME的常见形式是一个主类型加一个子类型,用斜线分隔。比如text/html、application/javascript、image/png、video/mpeg。
/之前的表示的是资源的主类型,而之后后的则是资源的编码。
它在1992年最早应用于电子邮件系统,但后来也应用到浏览器。服务器会将它们发送的多媒体数据的类型告诉浏览器,而通知手段就是说明该多媒体数据的MIME类型,从而让浏览器知道接收到的信息哪些是MP3文件,哪些是Shockwave文件等等。服务器将MIME标志符放入传送的数据中来告诉浏览器使用哪种插件读取相关文件。
浏览器接收到文件后,会进入插件系统进行查找,查找出哪种插件可以识别读取接收到的文件。如果浏览器不清楚调用哪种插件系统,它可能会告诉用户缺少某插件(例如你看视频时遇到提示安装Flash插件),或者直接选择某现有插件来试图读取接收到的文件,或者可能会导致系统的崩溃。
好啦!现在你知道了,MIME和文件扩展名之间有共同的用途:用来标注信息的格式。
但是他们之间可是完全不同的:
文件后缀名的作用是告诉操作系统在打开文件时应该采取什么行为,而MIME的作用则在于告诉信息接收者在解析这些信息时应该采取什么行为。
两者作用类似,但是应用场景不同,文件后缀名用于操作系统对文件的识别,而MIME用与数据传输场景中接收者对信息的识别。
MIME在分类上粒度更小,例如在以.text后缀的文件,文件内容可以是普通文本、css、js、html、xml、json,他们的MIME分类是text/plain、text/css、text/js、text/html、text/xml、text/json。
虽然如此,不要误解为它们是一对一或者一对多的关系,
他们是两套标注文件类型的方式。由于是两套文件类型识别方式,而且扩展名定义很随意,并没有统一标准。所以两者之间并没有统一的对应关系。比如我可以随意定义一个xxx.log的格式。内部存储的方式与txt文档一样,那么我这个.log文件的mime就与txt的一样:text/plain.
历史混乱的开始是这样的,web服务刚刚诞生的时候,所有网页都是静态的,只能靠超链接跳来跳去。对于页面、样式、图片的保存,最简单的方式就是把url地址直接映射到本地文件。
比如http://www.xxx.com/images/logo.jpg,实际就对应着服务器上的一个/xxxxxx/images/logo.jpg文件。在有人访问它时,返回的MIME type是image/jpeg。所以会造成一种误解:一个网址就是一个文件,它们的扩展名和MIME type是一一对应的。
实际上呢?当然不是这样,那只是在最简情况下的一种特殊做法。实际上,随着Web技术的发展,通过服务器端动态脚本和各种开发语言,网址和本地文件的关系已经不再紧密。
尤其是RESTful等风格的url流行开后,网址中的文件扩展名部分也不见了。主流的url都变成了http://www.xxx.com/users/zhangsan/followers/page/20/这种形式。早已看不到任何文件名的踪影,与本地文件彻底脱钩,没有任何关系了。