既然有文件后缀名,为何还需要MIME类型?

作者:Vincross
链接:https://www.zhihu.com/question/60495696/answer/204530120
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

下面是正经的科普时间。

文件扩展名是什么?

操作系统用来标注文件格式的一种机制,用一个点号(.)和主文件名分隔开。由于历史原因,多数扩展名是三个字母。

注意,这里说的是标注,而非定义,既然是标注,说明不是强制的。

比如你用photoshop可以打开一个psd图像文件。把这个文件扩展名改为txt,再拖到photoshop窗口里,还是一样能打开,说明内容完全没有变化,变化的只是双击时的默认打开方式。

而MIME又是什么?

它全名叫多用途互联网邮件扩展(Multipurpose Internet Mail Extensions),最初是为了将纯文本格式的电子邮件扩展到可以支持多种信息格式而定制的。后来被应用到多种协议里,包括我们常用的HTTP协议

MIME的常见形式是一个主类型加一个子类型,用斜线分隔。比如text/html、application/javascript、image/png等。

在访问网页时,MIME type帮助浏览器识别一个HTTP请求返回的是什么内容的数据,应该如何打开、如何显示。

看到了吧,两者有共同的用途:用来标注信息的格式。

但应用场景完全不同:一个是操作系统中标注文件的,一个是邮件和HTTP协议中用来标注网络数据的。

但为什么两者会发生混淆,以至于有人把错误的结论写进了百度百科呢?

这就是历史原因了。

当Web服务刚诞生时,所有的网页其实就是静态页面的展示,没有互动、没有动态内容,只能靠超链接跳来跳去。而这些页面、样式、图片保存在哪呢?最简单的方式就是把url地址直接映射到本地文件。

比如http://www.xxx.com/images/logo.jpg,实际就对应着服务器上的一个/xxxxxx/images/logo.jpg文件。在有人访问它时,返回的MIME type是image/jpeg。

所以会造成一种误解:一个网址就是一个文件,它们的扩展名和MIME type是一一对应的。

实际上呢?当然不是这样,那只是在最简情况下的一种特殊做法。实际上,随着Web技术的发展,通过服务器端动态脚本和各种开发语言,网址和本地文件的关系已经不再紧密。

一张图片的网址所返回的MIME type是固定的(比如image/jpeg),但它的本体对应的可能是服务器上的一个文件,也可能是缓存中的一段数据,还可能是数据库中的一个字段,甚至是程序代码动态生成的图像。

尤其是RESTful等风格的url流行开后,网址中的文件扩展名部分也不见了。主流的url都变成了http://www.xxx.com/users/zhangsan/followers/page/20/这种形式。早已看不到任何文件名的踪影,与本地文件彻底脱钩,没有任何关系了。

现在你知道文件扩展名和MIME type是作用相似,但应用场合完全不同的两种东西了吧。仅仅因为一些历史原因,让两者在某些情况下的外观有些重合,才导致了这些误解。

而这种错误的理解被人传来传去,最后还有一个根本连话都说不通顺的版本被写进了百度百科。

所·以·说:

程序猿们,能不用百度就不要用百度,就算真的用了,也别信百度百科和百度知道里那些为了凑积分不知从哪Ctrl-C Ctrl-V来的东西!

MIME类型是什么?包含哪些类型?

原文地址:https://www.cnblogs.com/H-BolinBlog/p/8870746.html

时间: 2024-10-08 03:49:32

既然有文件后缀名,为何还需要MIME类型?的相关文章

-05 08:57 ARCGIS地统计学计算文件后缀名为.shp文件制作

2011-07-05 08:57 ARCGIS地统计学计算文件后缀名为.shp文件制作 ARCAMP软件要进行地统计计算的文件后格式后缀名必须为.shp的文件,网上介绍的方法复杂难懂,那么制作.shp的文件怎么制作呢? 1.打开ArcMAP软件,点菜单栏“工具”下拉菜单中的“添加XY数据”,出现“添加XY数据”对话框,添加电子表格数据 “.dbf3”格式文件(参考“用ArcGIS9.3中标出地图中GPS点方法”第3点),点确定,GPS采集点出来了. 2.右单击图层栏刚才“添加XY数据”进来的文件

js 上传文件后缀名的判断 var flag=false;应用

js 上传文件后缀名的判断  var flag=false;应用 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> &

使用C语言获取文件后缀名的技巧

其实原来一直以为,C语言对于处理文件后缀名这种事是有点力不从心的(只能通过自己写一个小函数完成这种小需求),maybe C++可以有实现这种功能的STL或者类,但是因为本人对C++知之甚少,也就不在这里献丑了.今日上网本来想搜一段别人写好的代码片段,修改修改拿来用的,不过偶然在csdn论坛上有人提到了一个名叫_splitpath的c函数,貌似可以获取一个文件完整路径的各个部分,当然也包括后缀名了.既然有标准文件名处理函数,岂有不用之理.这里,小弟便为大家详解一下这个函数,以后有用到类似需求的时候

BAT-批量改文件后缀名

问题现象:在处理一个目录时,发现JPG文件都是以TMP文件命名的.双击打不开.要手动改一个为JPG. 问题处理: 1.新建一个TXT文件,内容写如下: ren *.tmp *.jpg 2.把TXT改为BAT文件后缀名. 3.把这个BAT文件放在要改后缀的文件同目录下面. 4.双击BAT文件就可以了.

文件后缀名 &nbsp; 、linux 和windows 互传文件 文件后缀名

文件后缀名   .linux 和windows 互传文件 文件后缀名 在linux 下面 命令 文件 都区分大小写 大写的 LS 就识别不了 ls 这个命令 LANG=en  就显示成英文 linux 和windows 互传文件 首相只能使用远程工具 xshell  .securecrt 首先安装一个包 yum install  -y lrzsz sz + 文件名   把linux 上的文件 传到  windows上 把 linux 上的 4.txt 传到windows 上 使用rz 回车 就可

VC获取文件后缀名

VC获取文件后缀名 2011-07-28 10:30:50|  分类: Visual C++ and O |  标签: |举报 |字号大中小 订阅 1. CString GetSuffix(CString strFileName) {         return strFileName.Right(strFileName.GetLength()-strFileName.ReverseFind('.')-1); }2.PathFindExtension3.忽略大小写方法 CString::Mak

分析复制文件,在复制过程中更改文件后缀名

这是我自己的做法: 将一个目录下的所有.java文件复制到另一个目录,但是要在复制的过程中更改文件后缀名. 思路:跟上一个一样,只是动作稍稍有一些不同,直接上代码 package pack; import java.util.*; import java.io.*; class CopyRenameFile{ public static void main(String[] args)throws IOException{ File dir=new File("E:\\JAVASE\\JAVA复

手闲 用Lua写了个批量修改文件后缀名的小工具

1 --[[-- 2 - renameFilePostfix_: 统一重命名文件的后缀名 3 - @param: param1 - 原文件后缀名 4 - @param: param2 - 目的文件后缀名 5 - @param: param3 - 目的文件前缀名 6 - @param: param4 - 目的文件文件夹路径 7 - @param: param5 - 原文件路径 8 - @param: ... 9 - @param: paramn - 原文件路径 10 11 ]] 12 local

Linux下的文件及文件后缀名

1.使用扩展名的背景意义: 一谈到文件类型,大家就能想到Windows的文件类型,比如file.txt.file.doc.file.sys.file.mp3.file.exe等,根据文件的后缀就能判断文件的类型.但在Linux一个文件是否能被执行,和后缀名没有太大的关系,主要看文件的属性有关.但我们了解一下Linux文件的后缀名还是有必要的,特别是我们自己创建一些文件,最好还是加后缀名,这样做的目的是仅仅是为了我们的在应用时方便. 现在的Linux桌面环境和Windows一样智能化,文件的类型是