RFC1867协议介绍
RFC1867协议 介绍
RFC1867协议主要是在HTTP协议的基础上为INPUT标签增加了file属性,同时限定了Form的method必须为POST,ENCTYPE必须为multipart/form-data。当然还增加了一些与此相关属性,但都不是很重要,我们在此不作讨论。
在一般的基于Web的程序中,我们往往使用<input type=”file”>标签,该标签在被浏览器解析后会产生一个文本框和一个浏览按钮,单击浏览按钮会出现系统的文件选择框。
2. 执行上传及<input type=”file”>标签的一些特性
在上图选择相应的文件,按Upload按钮即可把选择的文件上传到服务器(服务器端可用JspSmartUpload等组件接受文件)。归根结底上传的所有操作都是由浏览器作的,用户所做的只是简单地选择了一下文件而已,接下来的问题是,如何能把一个目录中所有的文件实现一次性上传?
(1) 因为目录下的文件数量是不定的,因此我们基本不可能通过增加多个<input type=”file”>标签的方式来解决问题。
(2) 如果在Jsp中我们可以考虑以下方式来解决:通过Jsp动态创建<input type=”file”>标签,并使所创建的标签不可见。把每个标签的Value属性设置为每个文件的路径。在按Upload时再实行一次性上传。在我们试验了之后就会发现,对<input type=”file”>的Value属性赋值是徒劳的行为,因为RFC1867协议并没有要求浏览器的实现者一定实现Value属性,而IE恰好忽略了Value属性。
即以下代码将是徒劳的(IE中)
<script language=”javascript”>
//对Value赋值
Form1.file1.value=”c://aa.txt”;
//执行后,IE将忽略此赋值
<.script>
上述两种方式均无法完成我们需要的功能,接下来我们只能剖析IE是如何完成上传功能,把具体的实现方法用ActiveX或(Applet)来完成。
3. HTTP协议的简单介绍
一般说来我们认为HTTP协议是构建在TCP/IP之上的协议,其实HTTP协议本身无此限制,但因现实中多数情况均是如此,我们就姑且如此认为。HTTP数据总体说来分三大部分:
(1) 请求行,如下格式
(Request) POST SP URL SP HTTP/1.1 /r/n
请求方法+空格+请求URL+空格+HTTP协议版本+回车换行
如:POST http://localhost:8080/test/test.jsp HTTP1.1/r/n
(Response)HTTP/1.1 SP 200 SP OK /r/n
HTTP协议应答版本+空格+状态码+状态描述+回车换行
如:HTTP/1.1 200 OK /r/n
请求行主要是描述请求的URL,HTTP协议版本,应答状态等信息。
(2) 请求头
在HttpServletRequest接口里已经封装了对HTTP头操作的方法。如Content-type,Content-length,User-Agent,Host等都是HTTP头。HTTP头主要描述了HTTP所传输数据的一些信息,如主机,数据内容类型,数据长度,代理类型等。
如:
User-Agent: myselfHttp/1.1/r/n
Accept: www/source; text/html; image/gif; */*/r/n
HTTP头+:+空格+头信息+回车换行
(3) HTTP实体
HTTP实体存放着,HTTP请求的内容,如参数信息,文本框的内容,隐含控件的值,ListBox的值等。如果在页面上存在:
<input type=”text” name=”userName” value=”zhangsan”>
<input type=”password” name=”password” value=”123”>
HTTP实体会出现以下形式:(POST提交)
userName=zhangsan&password=123
GET提交的时候需要解析HTTP请求行中的URL,在此不多作讨论。
4. RFC1867协议的数据格式
(1) RFC1867对HTTP头的变更
RFC1867对HTTP头作了适当地变更,但变更很小。首先content-type头由以前的:
content-type: application/x-www-form-urlencoded
变为
content-type: multipart/form-data; +空格+
boundary=---------------------------7d52b133509e2
即增加了boundary,所谓的boundary其实就是分割线,下文将看到,RFC1867利用boundary分割HTTP实体数据。boundary中数字字符区是随机生成的。
(2) 对HTTP实体的变更
因为RFC1867增加了文件上传得功能,而上传文件内容自然也会被加入到HTTP的实体中。现在因为既有HTTP一般的参数实体,又有上传文件的实体,所以用boundary把每种实体进行了分割,HTTP的实体看起来将是下面的样子:
-----------------------------7d52b133509e2
Content-Disposition: form-data; name="file1"; filename="c:/aa.txt"
Content-Type: text/plain
文件内容在此处
-----------------------------7d52b133509e2
Content-Disposition: form-data; name="userName"
zhangsan
-----------------------------7d52b133509e2
Content-Disposition: form-data; name="password"
123
-----------------------------7d52b133509e2—
{关于实体的其他说明:
Content-type: multipart/form-data, boundary=AaB03x
(/r/n)
--AaB03x //boundary content-disposition: form-data; name="user" //form 表单变量名 (/r/n) Wilson Peng //form 表单变量数据 --AaB03x content-disposition: form-data; name="myfile" //form 表单变量名 Content-type: multipart/mixed, boundary=BbC04y //新的描述和新的描述和boundary (/r/n) --BbC04y Content-disposition: attachment; filename="myphoto.gif" //attachment 图片名字 Content-type: image/gif //图片描述 Content-Transfer-Encoding: binary //编码方式 (/r/n) (...myphoto.gif) //图片内容略... --BbC04y-- --AaB03x--
}
很明显,增加了文件上传后,HTTP实体变得稍微复杂了,首先是通过boundary把实体分开,以便于读取,然后对FileUpload的格式也作了限制。
(3) RFC1867协议的数据格式
根据RFC1867协议,在HTTP实体中必须对每个上传得文件有说明头,如:
Content-Disposition: form-data; name="file1";
filename="c:/aa.txt"
Content-Disposition:指明内容类型是form-data
name="file1":指明页面上<input type=”file”>标签的名字是file1
filename="c:/aa.txt":指明上传文件在客户端上的全路径
空行:文件头说明完毕后,要加一空行,以表示后面的数据是文件的内容
文件内容:再接下来就是文件的内容
从这个角度说,完全可以利用HTTP协议+RFC1867协议开发基于文档管理应用程序。
5. 协议的实现(客户端)
协议的好处就是,只要你提供的数据符合协议的要求,Server端就可以正确解析你的请求。而不论数据是由IE产生的,或有你自己的Application产生的。通过上面的分析,我们已经基本清楚了RFC1867协议的要求,只要我们打开指定的端口,把数据按照协议的要求写进去就会模拟出IE上传的功能。用程序实现是非常Easy的事。附件将给出Java实现版本,程序只是简单地实现了上传,根据我们前面的分析实现文件上传,参数传递这种稍麻烦的形式也是比较简单的。另外,该程序并没有实现返回数据的解析,同样根据我们前面的分析,按照HTTP协议去解析返回的数据也不是难事。总之,希望本程序能起到抛砖引玉的作用,
RFC1867协议介绍相关推荐
- Android Http POST文件上传之-----RFC1867协议
RFC1867协议介绍 RFC1867协议主要是在HTTP协议的基础上为INPUT标签增加了file属性,同时限定了Form的method必须为POST,ENCTYPE必须为mu ...
- 常用开源协议介绍以及开源软件规范列表
1. 开源协议介绍 GPL: General Public License,开源项目最常用的许可证,衍生代码的分发需开源并且也要遵守此协议.该协议也有很多变种,不同变种要求会略微不同. MPL: MP ...
- open source license主流的开源软件协议介绍
open source license主流的开源软件协议介绍(20190222) 文章目录: 一.开源软件的直观介绍 二.常用开源协议介绍 三.常用开源协议之间的对比 当Adobe.Microsoft ...
- SNMP协议介绍和操作截图
第一章 SNMP协议介绍 SNMP协议 基于TCP/IP的网络管理包含3个组成部分: 1) 一个管理信息库MIB(Management Information Base).管理信息库包含所有代理进程的 ...
- VRRP协议介绍--转
http://www.cnblogs.com/jony413/articles/2697404.html VRRP协议介绍 参考资料: RFC 3768 1. 前言 VRRP(Virtual Rout ...
- Python教程之udp和tcp协议介绍
UDP介绍 UDP - 用户数据报协议,是一个无连接的简单的面向数据报的运输层协议.UDP不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但是并不能保证它们能到达目的地.由于UDP在传输数据 ...
- 【HTTP】另类的POST头数据 RFC1867协议格式简析
昨天在实战表单模拟提交的时候,有发现在提交某个表单的时候,页面(discuz!论坛)报错,无法检测到数据来源云云,但是我确实提交了http_referer了啊,怎么会出现这个情况呢?问了下haohap ...
- (4)ZYNQ AXI4总线协议介绍
1.1 ZYNQ AXI4总线协议介绍 1.1.1 本节目录 1)本节目录: 2)本节引言: 3)FPGA简介: 4)ZYNQ AXI4总线协议介绍: 5)结束语. 1.1.2 本节引言 " ...
- 音视频直播流程及常见视频流协议介绍
音视频直播流程介绍 常见视频流协议介绍 HLS HLS是苹果公司实现的基于 HTTP 的流媒体传输协议,全称 HTTP Live Streaming,可支持流媒体的直播和点播,主要应用在 iOS 系统 ...
- SNMP 网络协议介绍
这里填写标题 1. SNMP 网络协议介绍 1.1. 什么是 SNMP 1.1.1. 概述 1.1.2. SNMP 版本 1.2. OIDs 1.2.1. 什么是 OID 1.2.1.1. 可查询数量 ...
最新文章
- pythonfor循环遍历list_为什么for循环可以遍历list:Python中迭代器与生成器
- 【数字信号处理】傅里叶变换性质 ( 序列傅里叶变换共轭对称性质 | 实序列的幅频特性偶对称 | 实序列相频特性奇对称 | 示例说明 )
- Android 弱引用和软引用
- kubernetes1.8.4 安装指南 -- 6. 安装kubernetes master
- 「分块系列」数列分块入门3 解题报告
- js动态添加删除节点
- 大型企业都在用的Python反爬虫手段,破了它!
- python自动化测试脚本怎么编写_【Python + uiautomator2】之编写unittest自动化测试脚本...
- 编译原理教程_1 引论
- 平板竖屏_朱海舟吐槽iPad办公体验:大量竖屏应用缺乏适配
- php 中正则表达式详解
- 在线书籍阅读,免费搭建站点
- 如何保障业务0暂停下,从11gR2 MAA升级到12c?
- 阿里本地生活再出发:口碑入高德,备战美团、抖音
- 计算机内存不足 c盘快满了怎么办,电脑C盘内存快满了怎么清理垃圾
- Python Selenium:键盘鼠标操作
- 导航菜单背景切换效果
- 基于“python+”潮汐、风驱动循环、风暴潮等海洋水动力模拟
- Thumbnailator实现图片压缩
- ubuntu18美化(完整版)