http://blog.csdn.net/ai2000ai/article/details/52161979

昨天在实战表单模拟提交的时候,有发现在提交某个表单的时候,页面(discuz!论坛)报错,无法检测到数据来源云云,但是我确实提交了http_referer了啊,怎么会出现这个情况呢?问了下haohappy,他给了个pear的类,http/client,才发现,我研究了几天的东东,原来有个现成的可以用,“使用pear站在巨人的肩膀上”,这个果然没有错。过些天组装一个client试试看。
 
又扯远了,书归正传,说研究一下一个另类的post头,为什么说另类呢,因为一般的post头的
Content-Type: application/x-www-form-urlencoded
而他的是
Content-Type: multipart/form-data; boundary=-------7d71f4234700b8
 
那么两者的区别又在那里呢?
 
1、做过表单html的coder都知道,在需要有上传文件操作的时候,表单的类型必须是enctype="multipart/form-data",那么这里也就这个原因,究其根源,可以追溯到RFC1867协议,这个协议主要是在HTTP协议的基础上为INPUT标签增加了file属性,同时限定了Form的method必须为POST,ENCTYPE必须为multipart/form-data。
 
2、后者增加了boundary,所谓的boundary其实就是分割线,RFC1867利用boundary分割HTTP实体数据。boundary中数字字符区是随机生成的。
 
3、对HTTP实体的变更

因为RFC1867增加了文件上传的功能,而上传文件内容自然也会被加入到HTTP的实体中。现在因为既有HTTP一般的参数实体,又有上传文件的实体,所以用boundary把每种实体进行了分割,HTTP的实体看起来将是类似下面的样子:

-----------------------------7d71f4234700b8
Content-Disposition: form-data; name="formhash"

59329e15
-----------------------------7d71f4234700b8
Content-Disposition: form-data; name="isblog"

-----------------------------7d71f4234700b8
Content-Disposition: form-data; name="fid"

104
-----------------------------7d71f4234700b8
Content-Disposition: form-data; name="subject"

test
-----------------------------7d71f4234700b8
Content-Disposition: form-data; name="iconid"

0
-----------------------------7d71f4234700b8
Content-Disposition: form-data; name="usesig"

1
-----------------------------7d71f4234700b8
Content-Disposition: form-data; name="message"

test
-----------------------------7d71f4234700b8
Content-Disposition: form-data; name="attachperm[]"

0
-----------------------------7d71f4234700b8
Content-Disposition: form-data; name="attachdesc[]"

-----------------------------7d71f4234700b8
Content-Disposition: form-data; name="attach[]"; filename=""
Content-Type: application/octet-stream

-----------------------------7d71f4234700b8
Content-Disposition: form-data; name="attachperm[]"

0
-----------------------------7d71f4234700b8
Content-Disposition: form-data; name="attachdesc[]"

-----------------------------7d71f4234700b8
Content-Disposition: form-data; name="attach[]"; filename=""
Content-Type: application/octet-stream

-----------------------------7d71f4234700b8
Content-Disposition: form-data; name="wysiwyg"

1
-----------------------------7d71f4234700b8--

很明显,增加了文件上传后,HTTP实体变得稍微复杂了,首先是通过boundary把实体分开,以便于读取,然后对FileUpload的格式也作了限制。

4、那么同样,这种格式也是需要提供Content-Length属性的,那么和简单的post数据头相比较,就可以发现,变化的地方有:

......

Content-Type:

......
Content-Length:

......

数据体 goes here~

注意到这几个地方的变化后,就可以像往常一样post了

最新文章

  1. 水印第三版 ~ 变态水印(这次用Magick.NET来实现,附需求分析和源码)
  2. [LeetCode] Reverse Integer 翻转整数
  3. 图片切换小demo
  4. Navi.Soft30.开放平台.聚合.开发手册
  5. fetch the words from url
  6. C#配置升级
  7. Sqoop 1.99.4 安装
  8. android 5.0开发环境搭建
  9. 不带头结点的单链表递归删除元素为X的结点
  10. Reflow、Repaint 性能优化
  11. objective-c 中随机数的用法 (3种:arc4random() 、random()、CCRANDOM_0_1() )
  12. php 图像处理类
  13. Hibernate异常之关键字错误
  14. jsonp原理,封装,应用(vue项目)
  15. tp5 mkdir(): Permission denied 问题
  16. javaScript之数组操作方法(一)
  17. 在windows 10 上使用aspnet_regiis.exe -i 命令报 “此操作系统版本不支持此选项” 的解决办法
  18. 【转】Java基础——容器分类
  19. PHP查看内存使用
  20. Python基础【day02】:字符串(四)

热门文章

  1. [转帖]IBM Q3财报:云营收达到50亿美元 上升11%
  2. RabbitMQ 的消息持久化与 Spring AMQP 的实现剖析
  3. GIt 错误与常用命令
  4. chrome截屏的方法
  5. 换个语言学一下 Golang (13)——Web表单处理
  6. 《JavaScript高级程序设计》笔记:附录A ECMAScript Harmony
  7. HTML 图像标签(img)
  8. Android Drawable和Bitmap区别
  9. springboot-发布jar包
  10. Solr基础理论【相关度计算】