`
ariyue
  • 浏览: 345255 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

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.       代码实现
分享到:
评论

相关推荐

    RFC中文文档-txt

    RFC1867 HTML中基于表单的文件上传 RFC1869 SMTP服务扩展 RFC1878 变量长度子网表格用于IPv4 RFC1883 Internet协议,版本6(IPv6)说明书 RFC1901 基于社区的SNMPv2介绍 RFC1904 简单网络管理协议(SNMPv2)版本 2的一致...

    http1867协议中文版

    - [RFC1867](https://www.rfc-editor.org/rfc/rfc1867) - HTML中基于表单的文件上传 - [W3C HTML表单指南](https://www.w3.org/TR/html401/interact/forms.html) - HTML表单规范 通过以上分析,我们可以看到...

    按照RFC3984协议实现H264视频流媒体源代码

    代码附有详细的注释,应该很容易理解(前提是大家稍微对RFC3550 RFC3984协议有了解)。使用方法:直接在VC6上打开工程,编译。(需要注意的是大家要把IP地址改为自己的。在h264.h的#define DEST_IP "192.168.0.30"和...

    Ftp协议:RFC959和HTTP协议:RFC2616

    FTP是一种用于在网络上进行文件传输的应用层协议,最初设计用于在主机之间高效地交换文件。RFC959是FTP协议的官方标准文档,它定义了FTP的命令和响应格式、连接管理、数据传输机制以及用户认证方式等。FTP支持两种...

    中文版RFC,共456

    RFC1867 HTML中基于表单的文件上传 RFC1869 SMTP服务扩展 RFC1878 变量长度子网表格用于IPv4 RFC1883 Internet协议,版本6(IPv6)说明书 RFC1901 基于社区的SNMPv2介绍 RFC1904 简单网络管理协议(SNMPv2)版本 2的一致...

    PHP 文件上传源码分析(RFC1867)

    标题和描述中提到的知识点主要...总结来说,PHP文件上传功能的实现是基于RFC1867标准,通过HTML表单的改进和PHP后端的处理逻辑来完成的。开发者需要掌握相关的技术细节,以便在Web应用中安全、有效地实现文件上传功能。

    FTP协议RFC文档

    FTP(文件传输协议)是一种网络协议,用于在网络上进行文件传输。它在RFC959文档中被正式定义和描述,其功能是允许计算机用户通过网络在不同计算机系统之间传输文件。尽管FTP也可以由终端用户直接使用,但它主要是...

    rfc中文文档目录,包含部分翻译

    RFC1867 HTML中基于表单的文件上传 RFC1869 SMTP服务扩展 RFC1878 变量长度子网表格用于IPv4 RFC1881 IPv6 地址分配管理 RFC1883 Internet协议,版本6(IPv6)说明书 RFC1886 DNS扩展支持IP版本6 RFC1901 基于...

    http文件上传demo(http模拟POST表单上传文件)

    由于iOS无法通过html表单来上传文件,因此想要上传文件,必须实现http请求,而不能像其他语言那样通过html表单的post就能上传。此demo经过xcode5测试通过。此文件上传demo是按照 rfc1867协议实现的。

    FTP协议(RFC959)(中文版).pdf

    FTP协议(文件传输协议)是一种用于在计算机网络上传递文件的标准协议,它在RFC959标准文档中被正式定义。FTP的目标在于提高文件的共享性,允许用户间接地通过程序使用远程计算机,同时确保用户在不同主机系统间存储...

    一些中文RFC_40个文件.rar

    5. **FTP**:文件传输协议(FTP)的RFC规定了如何在网络上上传和下载文件。 6. **SSL/TLS**:安全套接层(SSL)和传输层安全(TLS)协议的RFC阐述了如何在网络通信中加密数据,保障信息安全。 7. **XML和JSON**:...

    nginx-upload-module:用于nginx Web服务器的模块,用于使用多部分数据编码(RFC 1867)处理文件上传

    的模块,用于使用多部分/表单数据编码( )处理文件上载以及根据协议进行的可恢复上载。 描述 该模块解析请求正文,该请求正文存储所有要上传到由指令指定的目录中的文件。 然后将文件从正文中剥离,然后将更改的...

    HTTP协议详解及RFC2616(HTTP)中文版

    - **POST**:向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。 - **PUT**:替换服务器上指定资源的全部内容。 - **DELETE**:删除服务器上指定的资源。 **HTTP状态码** 状态...

    配套资料-FTP协议的RFC-rfc0959.txt

    随时间推移,协议不断更新,如RFC172提出了面向用户层面的文件传输协议,而后续的RFC265则对FTP进行了修订以供进一步审查,RFC281则提议了更多改进措施。 本部分将详细介绍FTP的术语及其模型。需注意的是,此处定义...

    FTP - RFC959 中文版

    在实际应用中,FTP常用于网站的文件上传和更新,软件的分发,以及在不同系统间共享数据。尽管现在有了更安全的SFTP(SSH File Transfer Protocol)和FTPS(FTP over SSL/TLS),FTP仍然因其简单性和广泛支持而被广泛...

    edtftpj包和技术操作文件

    在一般的web应用中,文件上传可以分为两类(ftp...那么在服务器端,用户只要根据rfc1867协议解析request中的数据流就可以得到文件,但是这样上传的速度很慢了,并且对文件的大小又要求。相比之下,ftp上传就很优越了

    英文全套RFC0001-0500

    这里的“每段500”可能是指从RFC0001到RFC0500的文件合集,提供了从互联网早期到某个时间点的RFC文档。 **RFC文档详解** RFC文档是互联网发展的基石,它们记录了各种网络协议和技术的详细规格,包括TCP/IP协议栈、...

    PDF版RFC:rfc3501-4000。(共12部分)

    4. **网络管理和安全**:此范围内的RFC还涵盖了网络管理和安全协议,如SNMP(简单网络管理协议)的版本(如RFC 3410-3418)和网络安全协议的改进(如RFC 3947的IPsec)。 5. **互联网架构**:这些RFC也可能涉及到...

    HTML中文件上传与上传进度跟踪的原理分析.pdf

    RFC1867规范定义了如何在HTML表单中添加文件上传功能,它引入了`&lt;input type="file"&gt;`控件,使得用户可以在浏览器端选择本地文件并提交到服务器。当表单的`enctype`属性设置为`multipart/form-data`时,浏览器会按照...

    HTTP1.1协议中文版RFC2616

    - **文件上传/下载**: 使用HTTP POST和GET方法上传和下载文件。 - **实时通信**: 使用HTTP长轮询或WebSocket实现客户端与服务器之间的实时通信。 #### 五、总结 HTTP1.1协议作为互联网的核心协议之一,在分布式...

Global site tag (gtag.js) - Google Analytics