http协议上传文件
http协议是建立在tcp、ip协议的应用层规范。
http协议规范把http请求分为3个部分:状态行,请求头,请求体。所有的方法、实现,都是围绕 “如何运用和组织这三部分” 来完成的。
http里没有专门用于文件上传的请求方式,文件上传请求是在post请求基础之上定义出来的一种方式。
http协议规定 POST 请求提交的数据,必须放在消息主体(entity-body)中,但协议并没有规定消息主体的编码方式 。开发者可以自己决定消息主体的编码格式,只要最后发送的 HTTP 请求,满足上面的格式就可以。
数据发送出去,还要服务端解析成功才有意义。一般服务端语言如 php、python 等,以及它们的 framework,都内置了自动解析常见数据格式的功能。服务端通常是根据请求头(headers)中的 Content-Type 字段来获知请求中的消息主体是用何种方式编码,再对主体进行解析。
Content-Type 被指定为 application/x-www-form-urlencoded 时 ,提交的数据按照 key1=val1&key2=val2 的方式进行编码,key 和 val 都进行了 URL 转码。大部分服务端语言都对这种方式很好的支持,常用的如jQuery中的ajax请求,Content-Type 默认值都是application/x-www-form-urlencoded;charset=utf-8
Content-Type 请求头报头域
Content-Type 在发送到服务器时候 内容编码方式,它有如下的三个值。
①application/x-www-form-urlencoded:默认的编码方式。但是在用文本的传输和MP3等大型文件的时候,使用这种编码就显得 效率低下。
②multipart/form-data:指定传输数据为二进制类型,比如图片、mp3、文件。
③text/plain: 纯文体的传输。空格转换为 “+” 加号,但不对特殊字符编码。
普通的Post请求
请求头
POST /article/handle.php HTTP/1.1
Host: www.soapstudy.com
User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:41.0) Gecko/20100101 Firefox/41.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Referer: http://www.soapstudy.com/article/postupload.html
Connection: keep-alive
Content-Length : 65
Content-Type: application/x-www-form-urlencoded
消息体:body
uname=1234&email=12345&file=desktop.jpg&submit=%E6%8F%90%E4%BA%A4
此种方式只是将文件名,通过post方式传输给服务器,仅有名称而无文件信息,上面的Post请求是无法上传文件的。
指定传输数据为二进制类型
http协议支持传输二进制类型文件:
1、基础方法是post,需要post请求来组合实现。
2、与其他post方法的不同之处:是请求头的 Content-Type头域 和请求体。
3、传输二进制文件,必须包含一个特殊的头信息:Content-Type