你所不知道的ContentType

想炒出香喷喷的菜前总要对菜谱有一个大概的了解。首先先了解其重要组成部分MIME

MIME类型

MIME(Multipurpose Internet Mail Extension)类型是一种表示文档的性质和格式的标准化方法。在浏览器中使用MIME类型来告诉服务器确定如何处理文档数据和显示文档,而不是通过文件扩展名。

语法:
type/subtype

所有type可以分为不连续关联和复合 2 种,并且复合type的值仅为multipart 

样例:
text/plain  // 一个纯文本
text/html   //html文件
image/jpeg     //一个jpeg格式的图片
application/octet-stream //进行下载操作
multipart/form-data     // 表单数据

对于大部分文件而言,都有其对应的MIME类型。例如xx.jpg的MIME类型是image/jpn ,xx.html的MIME类型是text/html 。如果需要详细的MIME类型与文件映射表。你可以查看完整的MIME列表

当一个文本文件的默认MIME类型为text/html 。如果一个文本文件没有设置MIME类型,则浏览器默认设置为其默认值,并且假定能够显示它们。一个二进制文件的默认MIME类型为application/octet-stream ,对于一个未知MIME类型的二进制文件来说,浏览器同样会为其设置为默认MIME类型,并且浏览器会尝试询问执行或者下载操作。

注意:对于css类型,其MIME类型必须使用text/css

MIME嗅探
有一个名词叫MIME嗅探,顾名思义,在浏览器(主要为IE)认为文件的MIME类型错误或者没有设置时自动设置正确的MIME类型。你可能会想这样不是挺好的吗? 能避免开发者或者是用户设置了错误的MIME类型,那么这种方式是否成为主流呢?
很遗憾,它有优点,然而弊大于利。

  • 它违背了HTTP规范(大概为开发者能够通过设置不同的MIME类型来处理文件)。也因此,这种嗅探也使得用户无法对浏览器处理文件的方式有所选择
  • 对于具有危险性的可执行文件,一般浏览器将其看为未知类型的二进制文件,因此最多让用户选择下载与否,然而对于具有嗅探的IE浏览器来说,它会设置其为它认为较为正确的MIME类型,这将会导致绕过下载选项而直接使该文件直接在用户电脑运行,这是一个安全问题。这有一篇关于MIME sniffing “助纣为虐”的探讨。

因此,最为合理的是让用户自己设置MIME类型。

ContentType

contentType是实体头,用于指定交互数据(资源)的媒体类型。对于请求头部或者响应头部都能够出现。

语法:
contentType:[][,charset][,boundary] 
  • mediaType: 文件MIME类型(非必须是正确的MIME类型
  • charset:编码标准
  • boundary:区分每对key/value 的分割线,实质为随机的字符串


通过设置Request或者response的实体消息ContentType,能够让数据或者资源按照其MIME类型规定的处理或者显示方式被处理。

在浏览器中,最为常见的MIME类型有 text/html text/css  application/json  image/* application/x-www-form-urlencode multipart/form-data 。对于前3种比较容易理解,这里主要解释下后面2种类型。

  • application/x-www-form-urlencode 作用为将以key/value的文本数据对于所有字符都进行URL转码并上传,例如将{name:"lucy",age:"21"}转化为“name=lucy&age=21"并且它是浏览器的默认的ContentType值。
  • multipart/form-data 作用则能够上传文件和文本数据。对于提交文件而言,一定要设置其ContentType为multipart/form主要可以在 form 标签中设置 enctype='multipart/form' 或者 在jquery的ajax中设置中contentType:false等。


这是一个简单的HTTP请求

首先语法为: Content-Type: multipart/form-data; boundar=------string。 boundary----string 是一个分割符,而string则是随机生成的字符串,其满足最小可能的出现在文本数据的一个字符串。

其次,通过Request Payload可知道,boundary==----该分割符作为数据与数据间的分割,每条数据又包括Content-Disposition,Content-Type等等。对于这个例子我通过提交一个文件名为”transform.png",name为”file"的表单数据。

你所不知道的ContentType_第1张图片

 读者大概对ContentType有了一个了解,也明白了在提交表单前为什么需要设置正确的ContentType。(能让浏览器正确处理上传的数据通过一定的该设置的MIME类型的规定)


参考文献

MIME type

configuring of MIME type



你可能感兴趣的:(你所不知道的ContentType)