天空小小岛技术论坛

 找回密码
 注册
搜索
天空小小岛技术论坛 门户 查看主题

通过 http 协议上传文件(rfc1867协议概述) multipart/form-data;boundary 解释

发布者: 八号 | 发布时间: 2011-12-9 12:26| 查看数: 22063| 评论数: 0|帖子模式

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 :
  1. <form enctype="multipart/form-data" action="b.php" method="POST" >
  2.         <input type="hidden" name="a" value="txt11" /><br />
  3.         <input type="text" name="b" /><br />
  4.         <input type="file" name="c" /><br />
  5.         <input type="file" name="d" /><br />
  6.         <input type="submit" value="upload now" />
  7. </form>
复制代码
客户端应该向 127.0.0.1 发送如下内容:

  1. POST /b.php HTTP/1.1
  2. Accept: */*
  3. Accept-Language: zh-cn
  4. Content-Type: multipart/form-data; boundary=---------------------------40612316912668
  5. User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:9.0) Gecko/20100101 Firefox/9.0
  6. Host: 127.0.0.1
  7. Content-Length: 570
  8. Connection: Keep-Alive
  9. Cache-Control: no-cache
  10. Cookie:

  11. -----------------------------40612316912668
  12. Content-Disposition: form-data; name="a"

  13. txt11
  14. -----------------------------40612316912668
  15. Content-Disposition: form-data; name="b"

  16. txt22
  17. -----------------------------40612316912668
  18. Content-Disposition: form-data; name="c"; filename="11 - 副本.txt"
  19. Content-Type: text/plain

  20. aaaa
  21. abbb
  22. cdd
  23. ccc
  24. -----------------------------40612316912668
  25. Content-Disposition: form-data; name="d"; filename="11.txt"
  26. Content-Type: text/plain

  27. sfdsfsafsafsd
  28. sdfsdaf
  29. asfddsaf
  30. -----------------------------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 是红色内容的总长度(包括最后的回车)

注意这一行:
  1. 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

本文未提及,或错误之处,望请回帖提出

最新评论

小黑屋|手机版|Archiver|天空小小岛 ( 京ICP备17043412号-1|

GMT+8, 2018-11-21 11:27 , Processed in 0.097561 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表