标准参考

content-type 用于定义用户的浏览器或相关设备如何显示将要加载的数据,或者如何处理将要加载的数据,此属性的值可以查看 MIME 类型。

MIME (Multipurpose Internet Mail Extensions,多用途互联网邮件扩展) 是描述消息内容类型的因特网标准。MIME 消息能包含文本、图像、音频、视频以及其他应用程序专用的数据。

content-type 一般以下面的形式出现:

Content-Type: [type]/[subtype]; parameter

type 有下面的形式:

  • Text:用于标准化地表示的文本信息,文本消息可以是多种字符集和或者多种格式的;
  • Multipart:用于连接消息体的多个部分构成一个消息,这些部分可以是不同类型的数据;
  • Application:用于传输应用程序数据或者二进制数据;
  • Message:用于包装一个E-mail消息;
  • Image:用于传输静态图片数据;
  • Audio:用于传输音频或者音声数据;
  • Video:用于传输动态影像数据,可以是与音频编辑在一起的视频数据格式。

subtype 用于指定 type 的详细形式。“type/subtype”配对的集合和与此相关的参数。下面是最经常用到的一些 MIME 类型:

  • text/html(HTML 文档);
  • text/plain(纯文本);
  • text/css(CSS 样式表);
  • image/gif(GIF 图像);
  • image/jpeg(JPG 图像);
  • application/x-javascript(JavaScript 脚本);
  • application/x-shockwave-flash(Flash);
  • application/x- www-form-urlencoded(使用 HTTP 的 POST 方法提交的表单);
  • multipart/form-data(同上,但主要用于表单提交时伴随文件上传的场合)。

关于 content-type 的详细信息,请参考 HTML4.01 规范 6.7 Content types (MIME types) 中的内容。

关于 MIME 的相信信息,请参考 IETF 的 [RFC2045] 及 [RFC2046] 规范。

更多的 MIME 类型参见:

问题描述

Content-Type 报头字符串代表着服务器端发送给客户端浏览器的具体数据类型,浏览器将根据这个信息决定如何处理得到的数据内容。比如:'Content- Type:text/html' 表示着这是个 HTML 文件,需要渲染引擎解释内容后输出;'Content-Type: application/octet-stream' 表示这是个二进制流,需要下载到本地后由用户端环境决定如何使用。

每个浏览器内置支持的 Content-Type 类型表各不相同,这导致了某些类型字符串在某些浏览器下不被识别;另外,如果出现错误的 Content-Type 类型,各个浏览器又会以不同的方式处理。

造成的影响

未知的或者是错误的 Content-Type 类型,在各个浏览器中处理方式不一致,草率对待将有可能使得同一文件在各种浏览器中展现方式完全不同。

受影响的浏览器

所有浏览器  

问题分析

创建一个 Web 服务器,如 Apache。在服务器上编写一段动态代码,如:ct_test.php

<?php   $contentTypeList = array(     '0'=>'Content-Type: text/plain',     '1'=>'Content-Type: application/octet-stream',     '2'=>'Content-Type: application/x-rar-compressed',     '3'=>'Content-Type: application/zip',     '4'=>'Content-Type: application/x-shockwave-flash',     '5'=>'Content-Type: video/quicktime',     '6'=>'Content-Type: video/mp4',     '7'=>'Content-Type: audio/mpeg',     '8'=>'Content-Type: image/jpeg',     '9'=>'Content-Type: image/gif',     '10'=>'Content-Type: image/png',     '11'=>'Content-Type: application',     '12'=>'Content-Type: audio',     '13'=>'Content-Type: video',     '14'=>'Content-Type: image',     '15'=>'Content-Type: helloworld'     );   header($contentTypeList[$_GET["type"]]."; charset=UTF-8"); ?>

PHP 的文件中建立了 16 种 Content-Type 类型,根据 URL 中 GET 参数值选取其中一种文件类型 HTTP 报头发向客户端浏览器。其中 11 种常用类型,4 种故意写错的类型,1 种完全自定义类型:

  文件类型 Content-Type 类型
常见类型 文本 text/plain
二进制流 application/octet-stream
RAR 压缩包 application/x-rar-compressed
Zip 压缩包 application/zip
Flash 文件 application/x-shockwave-flash
QuickTime 视频 video/quicktime
MP4 视频 video/mp4
MP3 音频 audio/mpeg
JPEG 图片 image/jpeg
GIF 图片 image/gif
PNG 图片 image/png
书写有误类型 数据 application
音频 audio
视频 video
图像 image
浏览器不可识别类型 自定义类型 helloworld

分别以不同 HTTP Content-Type 报头类型运行此段代码,在不同的浏览器环境中的表现如下:

  IE6 IE7 IE8 Firefox Chrome Safari Opera
text/plain 显示文件内容 显示文件内容 显示文件内容 显示文件内容 显示文件内容
application/octet-stream 显示文件内容 下载文件 下载文件 下载文件 显示文件内容
application/x-rar-compressed 下载文件1 下载文件 下载文件 下载文件 下载文件
application/zip 下载文件1 下载文件 下载文件 下载文件 下载文件
application/x-shockwave-flash 试图显示 Flash 试图显示 Flash 试图显示 Flash 试图显示 Flash 试图显示 Flash
video/quicktime 下载文件 下载文件 下载文件 下载文件 下载文件
video/mp4 下载文件 下载文件 试图播放视频3 下载文件 下载文件
audio/mpeg 下载文件 下载文件 试图播放视频3 下载文件 下载文件
image/jpeg 显示文件内容 试图显示图片2 试图显示图片 试图显示图片 试图显示图片
image/gif 显示文件内容 试图显示图片2 试图显示图片 试图显示图片 试图显示图片
image/png 显示文件内容 试图显示图片2 试图显示图片 试图显示图片 试图显示图片
application 下载文件1 显示文件内容 显示文件内容 下载文件 显示文件内容
audio 下载文件1 显示文件内容 显示文件内容 下载文件 显示文件内容
video 下载文件1 显示文件内容 显示文件内容 下载文件 显示文件内容
image 下载文件1 显示文件内容 显示文件内容 下载文件 显示文件内容
helloworld 下载文件1 显示文件内容 显示文件内容 下载文件 显示文件内容

【注1】:这几种 Content-Type 类型在测试环境中的 IE6 IE7 IE8 浏览器弹出的下载对话框提示中,均显示“不可识别类型”

【注2】:Firefox 会将 URL 和一些错误信息输出在图片格式中显示。

【注3】:Chrome 试图使用 VIDEO 标记直接显示这两种格式的视频。

由表可见:

  • IE6 IE7 IE8 对于可以识别的非视频、音频流内容均会嗅探其内容,并且根据内容是否正常再决定如何输出显示;
    (关于嗅探的扩展阅读:CH9002: IE6 IE7 IE8 未按预期方式处理 content-type 为 text/plain 的内容
  • Firefox Chrome 对于未知 Content-Type 的内容均直接显示其内容,其他类型则以直接以最合适的方式处理;
  • Opera 对于可以识别的视频、音频流内容会直接提示下载,图片类型和 Flash 类型会试图显示他们,未知 Content-Type 的内容均直接显示其内容则直接显示其内容,但在显示内容前不会嗅探其中的 HTML 标记。

解决方案

这个问题比较复杂,如需避免出现显示异常,建议不要使用非法的 Content-Type 头字符串;并且文件实际内容和数据格式应与 Content-Type 头字符串内类型声明一致

ps: 今天碰到一个问题,firefox 输出shtml 文本输出,找半天发现apache 没设置  AddType text/html .shtml 默认的.shtml被当成纯文本输出了

各浏览器对常用或者错误的 Content-Type 类型处理方式不一致的更多相关文章

  1. 接入WxPusher微信推送服务出现错误:Content type 'application/x-www-form-urlencoded;charset=UTF-8' not supported

    背景 使用WxPusher微信推送服务 ,可以及时的将服务的一些运行异常信息,发送到自己的微信上,方便了解服务的运行状态(PS:这个服务是免费的). 你可以在这里看到WxPusher微信推送服务的接入 ...

  2. org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'application/json;charset=UTF-8' not supported或其他Content type不支持处理

    很久没从头到尾搭框架,今天搭的过程中,springmvc controller方法入参用@RequestBody自动绑定参数时一直提示各种 not supported 排查问题有两个解决路径: 1)使 ...

  3. Chrome浏览器与常用插件推荐

    Chrome浏览器与常用插件推荐 官方chrome下载:http://www.google.cn/chrome/ 提示:需要FQ才能安装. 1,AdBlock 谷歌屏蔽广告: https://chro ...

  4. 万能的ctrl+shift+F(Element 'beans' cannot have character [children], because the type's content type is element-only.错误)

    今天在spring-servlet.xml文件中出现了一个莫名其妙的错误:Element 'beans' cannot have character [children], because the t ...

  5. ajax使用向Spring MVC发送JSON数据出现 org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'application/x-www-form-urlencoded;charset=UTF-8' not supported错误

    ajax使用向Spring MVC发送JSON数据时,后端Controller在接受JSON数据时报org.springframework.web.HttpMediaTypeNotSupportedE ...

  6. 【python+selenium的web自动化】- 控制浏览器的常用操作

    如果想从头学起selenium,可以去看看这个系列的文章哦! https://www.cnblogs.com/miki-peng/category/1942527.html 前言 ​ 本文主要介绍se ...

  7. the request doesn't contain a multipart/form-data or multipart/form-data stream, content type header

    the request doesn't contain a multipart/form-data or multipart/form-data stream, content type header ...

  8. Java之POI读取Excel的Package should contain a content type part [M1.13]] with root cause异常问题解决

    Java之POI读取Excel的Package should contain a content type part [M1.13]] with root cause异常问题解决 引言: 在Java中 ...

  9. Jsoup问题---获取http协议请求失败 org.jsoup.UnsupportedMimeTypeException: Unhandled content type. Must be text/*, application/xml, or application/xhtml+xml.

    Jsoup问题---获取http协议请求失败 1.问题:用Jsoup在获取一些网站的数据时,起初获取很顺利,但是在访问某浪的数据是Jsoup报错,应该是请求头里面的请求类型(ContextType)不 ...

随机推荐

  1. Idea连接服务器docker并部署代码到docker实现一键启动

    好记性不如烂笔头,写笔记是为了回头看的. 谁要是不小心搜了看了,如有不足之处敬请谅解. 一.准备工作 虚拟机centos7.X,docker1.3.X,Win10 Idea2018.1 默认Idea已 ...

  2. SharePoint 2013 App 开发—SharePoint Hosted方式,

    这篇文章会依据简单的Demo,介绍一下SharePoint Hosted 方式开发App 的步骤和说明. 这种方式的环境相比较Office 365 要麻烦一些,如果不可以连接到Internet 或者还 ...

  3. 【POJ3321】Apple Tree(DFS序,树状数组)

    题意:给一棵n个节点的树,每个节点开始有一个苹果,m次操作 1.将某个结点的苹果数异或 1 2.查询一棵子树内的苹果数 n,m<=100000   思路:最近一段时间在思考树上统计问题的算法 发 ...

  4. touch上滑加载

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. 从Java源码到Java字节码

    Java最主流的源码编译器,javac,基本上不对代码做优化,只会做少量由Java语言规范要求或推荐的优化:也不做任何混淆,包括名字混淆或控制流混淆这些都不做.这使得javac生成的代码能很好的维持与 ...

  6. 数据结构自己实现——stack

    #define StackSize 100 typedef char DataType; class stack { public: DataType data[StackSize]; int top ...

  7. 更新YUM源后的arning: rpmts_HdrFromFdno: Header V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY错误

    yum源更新后需要导入key值,否则报错如下,无法安装相关的包. Totalsize:42M DownloadingPackages: warning:rpmts_HdrFromFdno:Header ...

  8. Codeforces Gym101572 J.Judging Moose (2017-2018 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2017))

     Problem J Judging Moose 这个题是这里面最简单的一个题... 代码: 1 //J 2 #include <stdio.h> 3 #include <math. ...

  9. 文艺平衡树(Splay)

    题目背景 这是一道经典的Splay模板题——文艺平衡树. 题目描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1, ...

  10. linux 用户管理命令学习

    groupadd www-data 添加组 useradd phpcomposer -g www-data 添加用户并加入组中 passwd phpcomposer 添加密码 usermod -g p ...