http post 传送文件详解(转载)
首先客户端链接 192.168.24.56 后, 应该发送如下 http 请求:
POST/logsys/home/uploadIspeedLog!doDefault.html HTTP/1.1
Accept: text/plain, _/_
Accept-Language: zh-cn
Host: 192.168.24.56
Content-Type:multipart/form-data;
boundary=-----------------------------7db372eb000e2
User-Agent: WinHttpClient
Content-Length: 3693
Connection: Keep-Alive
-------------------------------7db372eb000e2
Content-Disposition: form-data; name="file"; filename="kn.jpg"
Content-Type: image/jpeg
(此处省略 jpeg 文件二进制数据...)
-------------------------------7db372eb000e2--
此内容必须一字不差,包括最后的回车,红色字体部分就是协议的头。给服务器上传数据时,并非协议头每个字段都得说明,其中,content-type
是必须的,它包括一个类似标志性质的名为boundary
的标志,它可以是随便输入的字符串。对后面的具体内容也是必须的。它用来分辨一段内容的开始。Content-Length:
3693 ,这里的 3693 是要上传文件的总长度。绿色字体部分就是需要上传的数据,可以是文本,也可以是图片等。数据内容前面需要有 Content-Disposition
, Content-Type
以及 Content-Transfer-Encoding
等说明字段。最后的紫色部分就是协议的结尾了。
注意这一行
:
Content-Type: multipart/form-data;
boundary=---------------------------7db372eb000e2
根据 rfc1867
, multipart/form-data
是必须的.
---------------------------7db372eb000e2
是分隔符,分隔多个文件、表单项。其中 b372eb000e2
是即时生成的一个数字,用以确保整个分隔符不会在文件或表单项的内容中出现。Form 每个部分用分隔符分割,分隔符之前必须加上"--"着两个字符(即--{boundary})才能被 http 协议认为是 Form 的分隔符,表示结束的话用在正确的分隔符后面添加"--"表示结束。
前面的 ---------------------------7d
是 IE
特有的标志,Mozila
为---------------------------71
每个分隔的数据的都可以用 Content-Type
来表示下面数据的类型,可以参考 rfc1341
(http://www.ietf.org/rfc/rfc1341.txt)
例如
:Contect-Type:image/jpeg
表示下面的数据是 jpeg
文件数据
转载
:http://www.cnblogs.com/liangbin/articles/2117288.html
*******
HTTP 响应
在接收和解释请求消息后,服务器会返回一个 HTTP
响应消息。
与 HTTP
请求类似,HTTP
响应也是三个部分组成,分别是:
状态行、消息报头、响应正文。
状态行
:
状态行由协议版本、数字形式的状态代码、及相应的状态描述,各元素之间以空格分隔。
格式
: HTTP-Version Status-Code Reason-Phrase CRLF
例如
: HTTP/1.1 200 OK \r\n
状态代码
:
状态代码由 3
位数字组成,表示请求是否被理解或被满足。
状态描述:
状态描述给出了关于状态代码的简短的文字描述。
状态代码的第一个数字定义了响应的类别,后面两位没有具体的分类。
第一个数字有五种可能的取值:
- 1xx: 指示信息—表示请求已接收,继续处理。
- 2xx: 成功—表示请求已经被成功接收、理解、接受。
- 3xx: 重定向—要完成请求必须进行更进一步的操作。
- 4xx: 客户端错误—请求有语法错误或请求无法实现。
- 5xx: 服务器端错误—服务器未能实现合法的请求。
状态代码 | 状态描述 | 说明 |
---|---|---|
200 | OK | 客户端请求成功 |
400 | Bad | Request 由于客户端请求有语法错误,不能被服务器所理解。 |
401 | Unauthonzed | 请求未经授权。这个状态代码必须和 WWW-Authenticate 报头域一起使用 |
403 | Forbidden | 服务器收到请求,但是拒绝提供服务。服务器通常会在响应正文中给出不提供服务的原因 |
404 | Not Found | 请求的资源不存在,例如,输入了错误的 URL 。 |
500 | Internal Server Error | 服务器发生不可预期的错误,导致无法完成客户端的请求。 |
503 | Service Unavailable | 服务器当前不能够处理客户端的请求,在一段时间之后,服务器可能会恢复正常。 |
HTTP消息
HTTP消息
由客户端到服务器的请求和服务器到客户端的响应组成。请求消息和响应消息都是由开始行,消息报头(可选的),空行(只有CTLF
的行),消息正文(可选的)组成。
对于请求消息,开始行就是请求行。
对于响应消息,开始行就是状态行。
消息报头
HTTP 消息报头包括普通报头、请求报头、响应报头、实体报头。
每一个报头域都是由(名字+":"+空格+值)组成,消息报头域的名字是大小写无关的。
普通报头
在普通报头中,有少数报头域应用于所有的请求和响应消息,但并不用于被传输的实体,这些报头域只用于传输的消息。
常用的普通报头域:Cache-Control
,Date
,Connection
,Pragma
.
请求报头
请求报头允许客户端向服务器端传递该请求的附加信息以及客户端自身的信息。
常用的请求报头域:
Accept
Accept
请求报头域用语指定客户端接受哪些类型的信息。例如:Accept
:image/gif
,表明客户端希望接受GIF图象格式
的资源;Accept
:text/html
,表明客户端希望接受html文本
Accept-Charset
Accept-Charset
请求报头域用于指定客户端接受的字符集。例如:Accept-Charset
:ios-8859-1
,gb2312
。如果在请求消息中没有设置这个域,缺省是任何字符集都可以接受。
Accept-Encoding
Accept-Encoding
请求报头域类似Accept
,但是它是用于指定可接受的内容编码。例如:Accept-Encoding
:gzip
,deflate
。如果请求消息中没有设置这个域,服务器假定客户端对各种内容编码都可接受。
Accept-Language
Accept-Language
请求报头域类似于Accept
,但是它是用于指定一种自然语言。例如:Accept-Language
:zh-cn
。如果请求消息中没有设置这个域,服务器假定客户端对各种语言都可接受。
Authorization
Authorization
请求报头域主要用于证明客户端有权查看某个资源。当浏览器访问一个页面时,如果收到服务器的响应代码为401
(未授权),可以发送一个包含Authorization
请求报头域的请求,要服务器对其进行验证。
Host