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协议去解析返回的数据也不是难事。总之,希望本程序能起到抛砖引玉的作用,

6.       代码实现

RFC1867协议介绍相关推荐

  1. Android Http POST文件上传之-----RFC1867协议

    RFC1867协议介绍            RFC1867协议主要是在HTTP协议的基础上为INPUT标签增加了file属性,同时限定了Form的method必须为POST,ENCTYPE必须为mu ...

  2. 常用开源协议介绍以及开源软件规范列表

    1. 开源协议介绍 GPL: General Public License,开源项目最常用的许可证,衍生代码的分发需开源并且也要遵守此协议.该协议也有很多变种,不同变种要求会略微不同. MPL: MP ...

  3. open source license主流的开源软件协议介绍

    open source license主流的开源软件协议介绍(20190222) 文章目录: 一.开源软件的直观介绍 二.常用开源协议介绍 三.常用开源协议之间的对比 当Adobe.Microsoft ...

  4. SNMP协议介绍和操作截图

    第一章 SNMP协议介绍 SNMP协议 基于TCP/IP的网络管理包含3个组成部分: 1) 一个管理信息库MIB(Management Information Base).管理信息库包含所有代理进程的 ...

  5. VRRP协议介绍--转

    http://www.cnblogs.com/jony413/articles/2697404.html VRRP协议介绍 参考资料: RFC 3768 1. 前言 VRRP(Virtual Rout ...

  6. Python教程之udp和tcp协议介绍

    UDP介绍 UDP - 用户数据报协议,是一个无连接的简单的面向数据报的运输层协议.UDP不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但是并不能保证它们能到达目的地.由于UDP在传输数据 ...

  7. 【HTTP】另类的POST头数据 RFC1867协议格式简析

    昨天在实战表单模拟提交的时候,有发现在提交某个表单的时候,页面(discuz!论坛)报错,无法检测到数据来源云云,但是我确实提交了http_referer了啊,怎么会出现这个情况呢?问了下haohap ...

  8. (4)ZYNQ AXI4总线协议介绍

    1.1 ZYNQ AXI4总线协议介绍 1.1.1 本节目录 1)本节目录: 2)本节引言: 3)FPGA简介: 4)ZYNQ AXI4总线协议介绍: 5)结束语. 1.1.2 本节引言 " ...

  9. 音视频直播流程及常见视频流协议介绍

    音视频直播流程介绍 常见视频流协议介绍 HLS HLS是苹果公司实现的基于 HTTP 的流媒体传输协议,全称 HTTP Live Streaming,可支持流媒体的直播和点播,主要应用在 iOS 系统 ...

  10. SNMP 网络协议介绍

    这里填写标题 1. SNMP 网络协议介绍 1.1. 什么是 SNMP 1.1.1. 概述 1.1.2. SNMP 版本 1.2. OIDs 1.2.1. 什么是 OID 1.2.1.1. 可查询数量 ...

最新文章

  1. pythonfor循环遍历list_为什么for循环可以遍历list:Python中迭代器与生成器
  2. 【数字信号处理】傅里叶变换性质 ( 序列傅里叶变换共轭对称性质 | 实序列的幅频特性偶对称 | 实序列相频特性奇对称 | 示例说明 )
  3. Android 弱引用和软引用
  4. kubernetes1.8.4 安装指南 -- 6. 安装kubernetes master
  5. 「分块系列」数列分块入门3 解题报告
  6. js动态添加删除节点
  7. 大型企业都在用的Python反爬虫手段,破了它!
  8. python自动化测试脚本怎么编写_【Python + uiautomator2】之编写unittest自动化测试脚本...
  9. 编译原理教程_1 引论
  10. 平板竖屏_朱海舟吐槽iPad办公体验:大量竖屏应用缺乏适配
  11. php 中正则表达式详解
  12. 在线书籍阅读,免费搭建站点
  13. 如何保障业务0暂停下,从11gR2 MAA升级到12c?
  14. 阿里本地生活再出发:口碑入高德,备战美团、抖音
  15. 计算机内存不足 c盘快满了怎么办,电脑C盘内存快满了怎么清理垃圾
  16. Python Selenium:键盘鼠标操作
  17. 导航菜单背景切换效果
  18. 基于“python+”潮汐、风驱动循环、风暴潮等海洋水动力模拟
  19. Thumbnailator实现图片压缩
  20. ubuntu18美化(完整版)

热门文章

  1. 领导力的21个法则-盖子法则
  2. 赛码网输入输出(js v8)问题并配置赛码网vscode本地环境
  3. elasticsearch query里面的slop选项
  4. Partition Refinement
  5. 3D点云目标检测算法综述
  6. 简单的安卓网络音乐视频播放器app
  7. linux+sasl认证失败,memcached+SASL:更安全地访问memcached
  8. python做数据透视表_Python pandas中强大的数据透视表
  9. 侯捷C++八部曲笔记(一、面向对象)
  10. 光格科技递交科创板上会稿:拟募资6亿 预计年营收3亿