今天在做一个文件上传的功能的时候,发现我总是上传不了png的图片。经过调试发现,应该是在ContentType的地方判断失误了。后来百度了一下发现一个有意思的现象,我发现png的图片的ContentType并不是我在注册表中看到的image/png,而是image/x-png。也因此造成了上传不了png文件的原因(后来看了资料才知道我找错了注册表的位置)。经过自己测试,得出的结果如下:
IE6 | IE 8.0 | Chrome | Firefox | |
png | image/x-png | image/x-png | image/png | image/png |
jpg | image/pjpeg | image/jpeg | image/jpeg | image/jpeg |
jpeg | image/pjpeg | image/pjpeg | image/jpeg | image/jpeg |
bmp | image/bmp | image/bmp | image/bmp | image/bmp |
相比较而言,Chrome和FireFox的反映出的ContentType算是比较符合真实的答案的。那么,为什么会有这些差异呢?
- 首先来说一下MIME类型:
MIME类型就是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。
MIME的英文全称是"Multipurpose Internet Mail Extensions" 多功能Internet 邮件扩充服务,它是一种多用途网际邮件扩充协议,在1992年最早应用于电子邮件系统,但后来也应用到浏览器。服务器会将它们发送的多媒体数据的类型告诉浏览器,而通知手段就是说明该多媒体数据的MIME类型,从而让浏览器知道接收到的信息哪些是MP3文件,哪些是Shockwave文件等等。服务器将MIME标志符放入传送的数据中来告诉浏览器使用哪种插件读取相关文件。
MIME能够支持非ASCII字符、二进制格式附件等多种格式的邮件消息。这个标准被定义在; RFC 2045,; RFC 2046,; RFC 2047,; RFC 2048,; RFC 2049等RFC中。 由RFC 822转变而来的RFC 2822,规定电子邮件标准并不允许在邮件消息中使用7位ASCII字符集以外的字符。正因如此,一些非英语字符消息和二进制文件,图像,声音等非文字消息都不能在电子邮件中传输。MIME规定了用于表示各种各样的数据类型的符号化方法。
浏览器接收到文件后,会进入插件系统进行查找,查找出哪种插件可以识别读取接收到的文件。如果浏览器不清楚调用哪种插件系统,它可能会告诉用户缺少某插件,或者直接选择某现有插件来试图读取接收到的文件,后者可能会导致系统的崩溃。传输的信息中缺少MIME标识可能导致的情况很难估计,因为某些计算机系统可能不会出现什么故障,但某些计算机可能就会因此而崩溃。
在把输出结果传送到浏览器上的时候,浏览器必须启动适当的应用程序来处理这个输出文档。这可以通过多种类型MIME(多功能网际邮件扩充协议)来完成。在HTTP中,MIME类型被定义在Content-Type header中。
例如,假设你要传送一个Microsoft Excel文件到客户端。那么这时的MIME类型就是“application/vnd.ms-excel”。在大多数实际情况中,这个文件然后将传送给Execl来处理(假设我们设定Excel为处理特殊MIME类型的应用程序)。在ASP中,设定MIME类型的方法是通过Response对象的ContentType属性。
- IE中对MIME类型的解析:
在Microsoft Internet Explorer 4.0及更高版本,MIME类型确定发生在通过URL Moniker的 FindMimeFromData 方法。 确定的MIME类型允许URL名字对象和其他组件来查找并启动正确的对象服务器或应用程序来处理相关的内容。
The server-supplied MIME type, if available
An examination of the actual contents associated with a downloaded URL
The file name associated with the downloaded content (assumed to be derived from the associated URL)
Registry settings (file name extension/MIME type associations or registered applications) in effect during the download
原网址:http://www.cnblogs.com/liszt/archive/2010/12/31/1923134.html
Registry Locations
Location used by FindMimeFromData to find MIME type and progID from file name extension:
HKEY_CLASSES_ROOT\.***
Location used by FindMimeFromData to find application from progID:
HKEY_CLASSES_ROOT\<ProgId>\shell\open\command
Location used by URL monikers to find CLSIDs from MIME types:
HKEY_CLASSES_ROOT\MIME\Database\Content Type
The purpose of MIME type detection, or data sniffing, is to determine the MIME type (also known as content type or media type) of downloaded content using information from the following four sources:
关于具体的资料可以参考MSDN的文档:
http://msdn.microsoft.com/zh-cn/library/ms775147(v=VS.85).aspx中关于MIME类型的检测算法、和FindMimeFromData函数以及Uploaded MIME Types章节的内容。
- 为什么image/x-png前面有个x-:
Internet中有一个专门组织IANA来确认标准的MIME类型,但Internet发展的太快,很多应用程序等不及IANA来确认他们使用的MIME类型为标准类型。因此他们使用在类别中以x-开头的方法标识这个类别还没有成为标准,例如:x-gzip,x-tar等。事实上这些类型运用的很广泛,已经成为了事实标准。只要客户机和服务器共同承认这个MIME类型,即使它是不标准的类型也没有关系,客户程序就能根据MIME类型,采用具体的处理手段来处理数据。而Web服务器和浏览器(包括操作系统)中,缺省都设置了标准的和常见的MIME类型,只有对于不常见的 MIME类型,才需要同时设置服务器和客户浏览器,以进行识别。
这里有一个关于image/x-png的讨论http://stackoverflow.com/questions/2086374/what-is-the-difference-between-image-png-and-image-x-png.