文档章节

HTTP协议之multipart/form-data请求分析

水牛叔叔
 水牛叔叔
发布于 2013/10/13 13:31
字数 942
阅读 14607
收藏 32
点赞 1
评论 3

首先来了解什么是multipart/form-data请求:

根据http/1.1 rfc 2616的协议规定,我们的请求方式只有OPTIONS、GET、HEAD、POST、PUT、DELETE、TRACE等,那为为何我们还会有multipart/form-data请求之说呢?这就要从头来说了。

http协议大家都知道是规定了以ASCII码传输,建立在tcp、ip协议之上的应用层规范,规范内容把http请求分为3个部门:状态行,请求头,请求体。所有的方法、实现都是围绕如何运用和组织这三部分来完成的。换句话来说就是万变不离其中,只要我们了解了http请求的组成部分后,自然就可以应变任何实际工作中的需求和问题了。

关于状态行,请求头,请求体等三部分的具体内容,大家可以参考官方的协议文档http://www.faqs.org/rfcs/rfc2616.html,这里主要分析multipart/form-data请求具体是怎么一回事。

既然http协议本身的原始方法不支持multipart/form-data请求,那这个请求自然就是由这些原始的方法演变而来的,具体如何演变且看下文:

1、multipart/form-data的基础方法是post,也就是说是由post方法来组合实现的

2、multipart/form-data与post方法的不同之处:请求头,请求体。

3、multipart/form-data的请求头必须包含一个特殊的头信息:Content-Type,且其值也必须规定为multipart/form-data,同时还需要规定一个内容分割符用于分割请求体中的多个post的内容,如文件内容和文本内容自然需要分割开来,不然接收方就无法正常解析和还原这个文件了。具体的头信息如下:

Content-Type: multipart/form-data; boundary=${bound}

//其中${bound} 是一个占位符,代表我们规定的分割符,可以自己任意规定,但为了避免和正常文本重复了,尽量要使用复杂一点的内容。如:--------------------56423498738365

4、multipart/form-data的请求体也是一个字符串,不过和post的请求体不同的是它的构造方式,post是简单的name=value值连接,而multipart/form-data则是添加了分隔符等内容的构造体。具体格式如下:

--${bound}
Content-Disposition: form-data; name="Filename"

HTTP.pdf
--${bound}
Content-Disposition: form-data; name="file000"; filename="HTTP协议详解.pdf"
Content-Type: application/octet-stream

%PDF-1.5
file content
%%EOF

--${bound}
Content-Disposition: form-data; name="Upload"

Submit Query
--${bound}--
其中${bound}为之前头信息中的分割符,如果头信息中规定为123,那么这里也要为123,;可以很容易看出,这个请求体是多个相同的部分组成的:每一个部分都是以--加分隔符开始的,然后是该部分内容的描述信息,然后一个回车,然后是描述信息的具体内容;如果传送的内容是一个文件的话,那么还会包含文件名信息,以及文件内容的类型。上面的第二个小部分其实是一个文件体的结构,最后会以--分割符--结尾,表示请求体结束。

综上,可以知道要发送一个multipart/form-data的请求,其实任何支持post请求的工具或语言都可以支持,只是自己要稍微包装一下便可。

真相如下:

用firefox上传一个txt文件,内容为123test,用firebug查看网络请求细节。

请求头:

请求体:



http里没有专门用于文件上传的请求方式,文件上传请求是在post请求基础之上定义出来的一种方式。

参考资料:

百度百科: http://baike.baidu.com/view/9472.htm  

http1.1协议规范: http://www.faqs.org/rfcs/rfc2616.html

分析工具:httpAnalyzer

本文转载自:http://blog.csdn.net/five3/article/details/7181521

共有 人打赏支持
水牛叔叔

水牛叔叔

粉丝 138
博文 80
码字总数 36149
作品 2
珠海
程序员
加载中

评论(3)

水牛叔叔
水牛叔叔

引用来自“851228082”的评论

还是没懂。就是说,multipart/form-data,在http协议中不存在,是浏览器扩展的。只要后台能识别就可以?
存在的,就是一个标准格式
851228082
851228082
还是没懂。就是说,multipart/form-data,在http协议中不存在,是浏览器扩展的。只要后台能识别就可以?
ZackLee
ZackLee
原始所谓的multipart是酱紫 谢谢分享哦!
Content-Type: multipart/form-data

Content-Type: multipart/form-data; boundary=${bound} 先看一个post请求上传文件的http报文,如下, 通过上面这个报文,我们可以看到的数据参数为一下几个: 第一个参数,info 第二个参数,...

秋风醉了
2015/04/03
0
0
用Node.js 写web框架(五)

一周没更新啊...不过这周确实挺忙的(我才不说我偷懒来着呢)。 今天主要是完成POST方法提交multipart的支持(就是文件上传啦)。 首先贴一下改进过的参数包装函数: exports.wrap = functio...

Jeky
2012/11/24
0
7
如何使用multipart/form-data格式上传文件

在网络编程过程中需要向服务器上传文件。Multipart/form-data是上传文件的一种方式。 Multipart/form-data其实就是浏览器用表单上传文件的方式。最常见的情境是:在写邮件时,向邮件后添加附...

亭子happy
2012/10/17
0
0
android中的文件(图片)上传

android中的文件(图片)上传其实没什么复杂的,主要是对 multipa android中的文件(图片)上传其实没什么复杂的,主要是对 multipart/form-data 协议要有所了解。 关于 multipart/form-dat...

zyt_1978
2016/03/13
11
0
GET和POST的比较

HTTP 请求方式: GET和POST的比较 - GET和POST是HTTP的两个常用方法。 - 什么是HTTP? 超文本传输协议(HyperText Transfer Protocol -- HTTP)是一个设计来使客户端和服务器顺利进行通讯的协议。...

人情世故
2016/05/28
122
0
深入剖析PHP输入流 php://input

PHP输入流php://input在使用xml-rpc的时候,server端获取client数据,主要是通过php输入流input,而不是$POST数组。所以,这里主要探讨php输入流php://input对于php://input介绍,PHP官方手册...

xuanskyer
2016/07/03
37
0
PHP输入流php://input

PHP输入流php://input 在使用xml-rpc的时候,server端获取client数据,主要是通过php输入流input,而不是$_POST数组。所以,这里主要探 讨php输入流php://input 对一php://input介绍,PHP官方...

等风1306
2014/08/08
0
0
php://input , $_POST,$_GET

对一php://input介绍,PHP官方手册文档有一段话对它进行了很明确地概述。 php://input allows you to read raw POST data. It is a less memory intensive alternative to $HTTPRAWPOST_DATA......

长宁楚王陈涉
2016/06/04
53
0
使用multipart/form-data上传文件

1.使用POST发送数据 以POST方式发送数据主要是为了向服务器发送较大量的客户端的数据,它不受URL的长度限制。POST请求将 数据以URL编码的形式放在HTTP正文中,字段形式为fieldname=value,用...

一别经年
2014/01/20
0
0
php://input、$_POST 和 $HTTP_RAW_POST_DATA 的区别与详解

PHP 用于开发 webservice 的 API 接口与客户端做数据交互时不一定会使用 PHP 可以处理的数据格式进行通信,比如 API 常用的 json xml,在此场景下我们需要使用其他的方式获取客户端发来的数据...

big_cat
2016/03/04
235
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

shell中的函数、shell中的数组、告警系统需求分析

shell中的函数 格式: 格式: function f_name() { command } 函数必须要放在最前面 示例1(用来打印参数) 示例2(用于定义加法) 示例3(用于显示IP) shell中的数组 shell中的数组1 定义数...

Zhouliang6
今天
2
0
用 Scikit-Learn 和 Pandas 学习线性回归

      对于想深入了解线性回归的童鞋,这里给出一个完整的例子,详细学完这个例子,对用scikit-learn来运行线性回归,评估模型不会有什么问题了。 1. 获取数据,定义问题     没有...

wangxuwei
今天
1
0
MAC安装MAVEN

一:下载maven压缩包(Zip或tar可选),解压压缩包 二:打开终端输入:vim ~/.bash_profile(如果找不到该文件新建一个:touch ./bash_profile) 三:输入i 四:输入maven环境变量配置 MAVEN_HO...

WALK_MAN
今天
0
0
33.iptables备份与恢复 firewalld的9个zone以及操作 service的操作

10.19 iptables规则备份和恢复 10.20 firewalld的9个zone 10.21 firewalld关于zone的操作 10.22 firewalld关于service的操作 10.19 iptables规则备份和恢复: ~1. 保存和备份iptables规则 ~2...

王鑫linux
今天
2
0
大数据教程(2.11):keeperalived+nginx高可用集群搭建教程

上一章节博主为大家介绍了目前大型互联网项目的系统架构体系,相信大家应该注意到其中很重要的一块知识nginx技术,在本节博主将为大家分享nginx的相关技术以及配置过程。 一、nginx相关概念 ...

em_aaron
今天
1
0
Apache Directory Studio连接Weblogic内置LDAP

OBIEE默认使用Weblogic内置LDAP管理用户及组。 要整理已存在的用户及组,此前办法是导出安全数据,文本编辑器打开认证文件,使用正则表达式获取用户及组的信息。 后来想到直接用Apache Dire...

wffger
今天
2
0
HFS

FS,它是一种上传文件的软件。 专为个人用户所设计的 HTTP 档案系统 - Http File Server,如果您觉得架设 FTP Server 太麻烦,那么这个软件可以提供您更方便的档案传输系统,下载后无须安装,...

garkey
今天
1
0
Java IO类库之BufferedInputStream

一、BufferedInputStream介绍 /** * A <code>BufferedInputStream</code> adds * functionality to another input stream-namely, * the ability to buffer the input and to * sup......

老韭菜
今天
0
0
STM 32 窗口看门狗

http://bbs.elecfans.com/jishu_805708_1_1.html https://blog.csdn.net/a1985831055/article/details/77404131...

whoisliang
昨天
1
0
Dubbo解析(六)-服务调用

当dubbo消费方和提供方都发布和引用完成后,第四步就是消费方调用提供方。 还是以dubbo的DemoService举例 -- 提供方<dubbo:application name="demo-provider"/><dubbo:registry address="z...

青离
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部