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

88 篇文章 0 订阅
4 篇文章 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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值