|
1、概述
在最初的 http 协议中,没有上传文件方面的功能。 rfc1867 (http://www.ietf.org/rfc/rfc1867.txt) 为 http 协议添加了这个功能。客户端的浏览器,如 Microsoft IE, Mozila, Opera 等,按照此规范将用户指定的文件发送到服务器。服务器端的网页程序,如 php, asp, jsp 等,可以按照此规范,解析出用户发送来的文件。Microsoft IE, Mozila, Opera 已经支持此协议,在网页中使用一个特殊的 form 就可以发送文件。绝大部分 http server ,包括 tomcat ,已经支持此协议,可接受发送来的文件。各种网页程序,如 php, asp, jsp 中,对于上传文件已经做了很好的封装。
注意Form表单中enctype="multipart/form-data", method="POST", type="file" 这三个属性是必须的。multipart/form-data 是新增的编码类型,以提高二进制文件的传输效率。
2、上传文件的实例:
1. 在一个 html 网页中,写一个如下的form :- <form enctype="multipart/form-data" action="b.php" method="POST" >
- <input type="hidden" name="a" value="txt11" /><br />
- <input type="text" name="b" /><br />
- <input type="file" name="c" /><br />
- <input type="file" name="d" /><br />
- <input type="submit" value="upload now" />
- </form>
复制代码 客户端应该向 127.0.0.1 发送如下内容:
- POST /b.php HTTP/1.1
- Accept: */*
- Accept-Language: zh-cn
- Content-Type: multipart/form-data; boundary=---------------------------40612316912668
- User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:9.0) Gecko/20100101 Firefox/9.0
- Host: 127.0.0.1
- Content-Length: 570
- Connection: Keep-Alive
- Cache-Control: no-cache
- Cookie:
- -----------------------------40612316912668
- Content-Disposition: form-data; name="a"
- txt11
- -----------------------------40612316912668
- Content-Disposition: form-data; name="b"
- txt22
- -----------------------------40612316912668
- Content-Disposition: form-data; name="c"; filename="11 - 副本.txt"
- Content-Type: text/plain
- aaaa
- abbb
- cdd
- ccc
- -----------------------------40612316912668
- Content-Disposition: form-data; name="d"; filename="11.txt"
- Content-Type: text/plain
- sfdsfsafsafsd
- sdfsdaf
- asfddsaf
- -----------------------------40612316912668--
复制代码 此请求包中
-----------------------------40612316912668
Content-Disposition: form-data; name="a"
txt11
-----------------------------40612316912668
Content-Disposition: form-data; name="b"
txt22
-----------------------------40612316912668
Content-Disposition: form-data; name="c"; filename="11 - 副本.txt"
Content-Type: text/plain
aaaa
abbb
cdd
ccc
-----------------------------40612316912668
Content-Disposition: form-data; name="d"; filename="11.txt"
Content-Type: text/plain
sfdsfsafsafsd
sdfsdaf
asfddsaf
-----------------------------40612316912668--
内容必须一字不差,包括 -----------------------------40612316912668-- 的后面还有一个回车。
注意:Content-Length: 570 这里的 570 是红色内容的总长度(包括最后的回车)
注意这一行:- Content-Type: multipart/form-data; boundary=---------------------------40612316912668
复制代码 根据 rfc1867, multipart/form-data是必须的.
---------------------------40612316912668 是分隔符,分隔多个文件、表单项。其中40612316912668 是即时生成的一个数字,用以确保整个分隔符不会在文件或表单项的内容中出现。
消息头中的 boundary 比数据包中的 boundary 少 --
而最后一个boundary最后多出个 --
提交数据实际上的格式是这样的:
假设HTTP头中我们指定的分割付是xxxxxx,那么提交数据的格式是:
\r\n--xxxxxx\r\n\r\n<数据>\r\n--xxxxxx\r\n\r\n<数据>\r\n--xxxxxx--\n
本文未提及,或错误之处,望请回帖提出 |
|