一种基于RFC1867规范的HTTP协议的文件上传方法.pdf

上传人:1*** 文档编号:1105334 上传时间:2018-03-31 格式:PDF 页数:15 大小:694.11KB
返回 下载 相关 举报
摘要
申请专利号:

CN200810119142.4

申请日:

2008.08.28

公开号:

CN101662484A

公开日:

2010.03.03

当前法律状态:

终止

有效性:

无权

法律详情:

未缴年费专利权终止IPC(主分类):H04L 29/08申请日:20080828授权公告日:20120725终止日期:20160828|||授权|||实质审查的生效IPC(主分类):H04L 29/08申请日:20080828|||公开

IPC分类号:

H04L29/08

主分类号:

H04L29/08

申请人:

中国科学院声学研究所

发明人:

王劲林; 白 鹤; 苏孝强

地址:

100190北京市海淀区北四环西路21号中国科学院声学研究所

优先权:

专利代理机构:

北京法思腾知识产权代理有限公司

代理人:

杨小蓉

PDF下载: PDF下载
内容摘要

本发明涉及一种基于RFC1867规范的HTTP协议的文件上传方法,该方法基于UGiA-PHP-UPLOADER组件的系统架构,实现客户端进度控制、服务器端数据接收、按照RFC1867协议的即时解析和状态日志读取,包括:(1)浏览器提交的步骤;(2)客户控制端控制的步骤;(3)服务器端数据接收处理模块处理的步骤;(4)服务器端响应模块响应的步骤。其优点在于:(1)脱离了Web服务器对表单上传的控制,摆脱了其对文件长度和传输时间的限制;同时不需要额外的插件就能完成文件的上传;(2)计算效率高,并保

权利要求书

1: 一种基于RFC1867规范的HTTP协议的文件上传方法,该方法基于 UGiA-PHP-UPLOADER组件的系统架构,实现客户端进度控制、服务器端数据接收、 按照RFC1867协议的即时解析和状态日志读取,包括以下步骤: (1)浏览器提交的步骤,是指通过浏览器填写基于RFC1867规范、属性设置 为“multipart/form-data”的表单,然后提交到客户控制端; (2)客户控制端控制的步骤,是指客户控制端向服务器端上传表单数据并与服 务器端通信,包括: (21)启动定时器,并初始化XMLHTTP的实例,设置GET方法定时发送异步 请求到服务响应端轮询状态,得到端口号信息Port,代表服务端已做好接收数据准 备;取得父页面表单对象,设置“action”属性为“http://IP:Port”,即设置Port为新上传 端口,开始文件的表单数据的上传;同时,初始化进度条页面:设置抬头信息“开始 上传”,显示服务器端口; (22)客户控制端接到数据传送完成信号,重组表单的数据项,将file控件替换 成值为接收文件存放位置的text控件,然后通过HTTP向服务器端提交表单;所述 完成信号是包含表单数据的数组数据; (3)服务器端数据接收处理模块处理的步骤,是指服务器端数据接收处理模块 监听Port端口,接收、解析表单数据,储存数据文件和状态文件,包括以下步骤: (31)数据接收处理模块采用32位随机数对上传表单命名,然后确定临时文件 存储文件夹的个数P,采用哈希函数对文件进行均匀分配; (32)服务器端初始化新上传端口Port,将服务器端的IP地址和Port端口信息 写入状态文件,实例化Socket对象并监听新上传端口Port,表单数据从Port端口传 入并由服务器端数据处理模块的UGiA-PHP-UPLOADER组件接收处理; (33)遵照HTTP协议编写200的响应头,将响应头回复给Port请求端口的客 户端,随后按照一定字节长度循环读取Socket数据流,将读取数据作为一个单元压 入到一定长度的字符队列; (4)服务器端响应模块响应的步骤,是指服务器端读取状态日志、组织文件信 息和进度数据、回复客户端请求。
2: 根据权利要求1所述的文件上传方法,其特征在于,所述步骤(21)的初始 化进度条页面的步骤还包括,客户端定时请求服务器端日志数据,通过DOM接口处 理进度条的即时状态显示的步骤; 所述进度条中显示文件的相关信息包括:上传的文件名和混合数据的长度信息; 所述进度条中显示上传进度的信息包括:上传文件的比例、平均速度和剩余时间。
3: 根据权利要求1所述的文件上传方法,其特征在于,所述步骤(31)包括文 件上传过程中基于哈希映射算法的文件管理;文件上传时分配的步骤如下:首先, 数据文件命名的采用32位随机数,即时时间叠加随机数得到种子,将种子输入MD5 函数运算得到文件名name;然后,确定临时文件存储文件夹的个数P,再采用哈希 函数对文件名进行映射,哈希函数中对文件名中每一位字符的ASCII码求和,所得 和值对P取模,哈希函数的输出是文件名为name的数据文件的储存文件夹,所述哈 希函数公式如下: hash ( key ) = Σ i = 1 key . length Ascii ( key ( i ) ) mod p ]]> p≠2 ω ,ω∈(0,1,2...) 其中,储存文件夹数目P是系统初始化时根据峰值并发量确定。
4: 根据权利要求1所述的文件上传方法,其特征在于,所述步骤(33)包括以 下子步骤: (331)在循环读取次数是队列长度的整数倍次时,将队列中内容全部顺次写入 磁盘数据文件fname.dat; (332)新数据压入队列后,按照RFC1867规范即时解析队列中内容,获得上传 状态,写入日志文件。
5: 根据权利要求4所述的文件上传方法,其特征在于,所述步骤(332)包括 以下子步骤: (332.1)解析HTTP头HEAD中内容,获得两部分信息:数据长度和分隔符; 所述数据长度在数据格式中用“Content-Length”标记,获得后写入fname.con;所述分 隔符是“Content-Type”标记、并以分号相隔赋值的第二部分,取值存入一个全局变量; (332.2)解析HTTP头正文内容,每个分隔符换行之后就是表单各控件的输入 内容,分号分开的各部分有“name”、“value”、“Content-Disposition”值;如果是文件 控件,还会有“filename”、“Content-Type”分别代表在客户电脑存储路径和上传文件类 型;将上传文件的内容写入fname.inf; (332.3)解析中遇到分界符连上两个“-”,换行之后“ok”,代表HTTP包传输结 束;整理(332.2)解析出来的表单内容和新文件的信息写入fname.frm。

说明书


一种基于RFC1867规范的HTTP协议的文件上传方法

    【技术领域】

    本发明涉及互联网HTTP领域,特别涉及一种基于RFC1867规范的HTTP协议的文件上传方法。

    背景技术

    文件上传是互联网的一项基本应用,现有上传技术按照架构可以分为两类:C/S模式和B/S模式。C/S模式上传技术,需要在客户端和服务器端安装专门软件,功能强大,但操作复杂、移植不便。常见的有FTP以及版本管理软件。HTTP是一种基于请求/响应(B/S)模式的协议,一个客户机与服务器建立连接后,发送一个请求给服务器,请求包括:请求的方法、URI(Uniform Resource Identifier)、协议版本号。随后还有MIME(Multipurpose InternetMail Extension protocol)信息:包括请求修饰符、客户机信息和可能的内容。服务器接到请求后,给予相应的响应信息,其格式为一个状态行,包括信息的协议版本号、一个成功或错误的代码,后边是MIME信息包括服务器信息、实体信息和可能的内容。而基于FORM表单的文件上传,文件的信息和内容正是封装在MIME信息内发送到服务器端的。B/S模式上传技术包括了三类机制:RFC1867、PUT和WebDav。遵循RFC1867规范的上传方法因为定制部署方便的优势,现今获得广泛应用,主流的浏览器、Web服务器和服务器端语言都对此规范有很好的支持,它在用户端的基本形式是浏览器中的Form表单,图1为RFC1867协议流程,处理步骤如下:

    1、用户在浏览器端填写特定类型(multipart/form-data)的Form表单,并提交;

    2、服务器监听HTTP服务端口(一般80),接收表单混合数据;

    3、Web服务器按照RFC1867规范解析表单,使用服务器端程序(PHP、JSP、ASP)的接口变量获得解析后的内容进行处理;

    4、返回给用户执行结果。

    RFC1867上传方法通用性强,服务器端不需要提供Web外其它服务,但是其可控性差,不会即时解析上传过程的进度信息,无法获得即时状态;而且表单上传会受到Web服务器对每个进程分配内存大小的限制,使得上传的文件存在连接时间和文件大小方面的限制,对大文件支持不好,这就导致了封装RFC1867协议的第三方组件大量出现:

    1、JAVA实现的组件

    常用的有Commons-fileupload和smartupload:前者的缺点是把上传数据流全部写入内存,导致内存占用过多,并在上传大文件时会受到web服务器限制;后者是Jakarta一个项目中的组件,没有进度控制,用户体验不好。目前的上传组件支持进度显示,基于JAVA实现的接收文件处理服务需要经过虚拟机层的编译,效率不高。另外存在Java实现的Applet小程序,可以嵌入网页,绕开RFC1867实现上传,其本质是一个小客户端,并且需要安装额外的JVM插件。

    2、ASP实现的组件

    常用的有SlickUpload、SAFileUp,其性能优越,但是需要付费,源码没有公开,就不能根据具体需求适应更改更新,而且使用ASP语言只能适用于Windows IIS服务器。

    3、Activex上传组件

    使用ASP调用组件,可以完成较丰富的上传功能,但是因为安全性因素,Activex控件在用户端会被浏览器控制选项禁用。

    【发明内容】

    本发明的目的在于,为了克服现有技术当中Web服务器对文件长度和传输时间限制、上传组件可控性差、不支持上传进度、可扩展性差、移植部署不便的缺点,提供一种基于RFC1867规范的HTTP协议的文件上传方法,通过将数据上传至非HTTP指定端口,由自己的数据处理段进行接收和解析,实现了可移植性好的对大文件支持组件;并且通过异步通信获得实时进度进行显示。

    所述文件上传方法是基于UGiA-PHP-UPLOADER组件的系统架构,实现客户端进度控制,服务器端数据接收、按照RFC1867协议的即时解析和状态日志读取,包括以下步骤:

    (1)浏览器提交的步骤,是指终端用户在浏览器中填写基于RFC1867规范、属性设置为“multipart/form-data”的表单,然后提交到客户控制端;

    (2)客户控制端控制的步骤,是指客户控制端向服务器端上传表单数据并与服务器端通信,包括:

    (21)启动定时器,并初始化XMLHTTP的实例,设置GET方法定时发送异步请求到服务响应端轮询状态,得到端口号信息Port,代表服务端已做好接收数据准备;取得父页面表单对象,设置“action”属性为“http://IP:Port”,即设置Port为新上传端口,开始文件的表单数据的上传;同时,初始化进度条页面:设置抬头信息“开始上传”,显示服务器端口;

    (22)客户控制端接到数据传送完成信号,重组表单的数据项,将file控件替换成值为接收文件存放位置的text控件,然后通过HTTP向服务器端提交表单;所述完成信号是包含表单数据的数组数据;

    (3)服务器端数据接收处理模块处理的步骤,是指服务器端数据接收处理模块监听Port端口,接收、解析表单数据,储存数据文件和状态文件,包括以下步骤:

    (31)数据接收处理模块采用32位随机数对上传表单命名,然后确定临时文件存储文件夹的个数P,采用哈希函数对文件进行均匀分配;

    (32)服务器端初始化新上传端口Port,将服务器端地IP地址和Port端口信息写入状态文件,实例化Socket对象并监听新上传端口Port,表单数据从Port端口传入并由服务器端数据处理模块的UGiA-PHP-UPLOADER组件接收处理;

    (33)遵照HTTP协议编写200的响应头,将响应头回复给Port请求端口的客户端,随后按照一定字节长度循环读取Socket数据流,将读取数据作为一个单元压入到一定长度的字符队列;

    (4)服务器端响应模块响应的步骤,是指服务器端读取状态日志、组织文件信息和进度数据、回复客户端请求。

    其中,所述步骤(21)的初始化进度条页面的步骤还包括,客户端定时请求服务器端日志数据,通过DOM接口处理进度条的即时状态显示的步骤;

    所述进度条中显示文件的相关信息包括:上传的文件名和混合数据的长度信息;所述进度条中显示上传进度的信息包括:上传文件的比例、平均速度和剩余时间。

    其中,所述步骤(31)包括文件上传过程中基于哈希映射算法的文件管理;文件上传时分配的步骤如下:首先,数据文件命名的采用32位随机数,即时时间time()叠加随机数rand(0,99999)得到种子,将种子输入MD5函数运算得到文件名name;然后,确定临时文件存储文件夹的个数P,再采用哈希函数对文件名name进行映射,哈希函数中对文件名name中每一位字符的ASCII码求和,所得和值对P取模,哈希函数的输出是文件名为name的数据文件的储存文件夹,所述哈希函数公式如下:

    hash(key)=Σi=1key.lengthAscii(key(i))modp]]>

    p≠2ω,ω∈(0,1,2...)

    其中,储存文件夹数目P是系统初始化时根据峰值并发量确定。

    其中,所述步骤(33)包括以下子步骤:

    (331)在循环读取次数是队列长度的整数倍次时,将队列中内容全部顺次写入磁盘数据文件fname.dat;

    (332)新数据压入队列后,按照RFC1867规范即时解析队列中内容,获得上传状态,写入日志文件。

    其中,所述步骤(332)包括以下子步骤:

    (332.1)解析HTTP头HEAD中内容,获得两部分信息:数据长度和分隔符;所述数据长度在数据格式中用“Content-Length”标记,获得后写入fname.con;所述分隔符是“Content-Type”标记、并以分号相隔赋值的第二部分,取值存入一个全局变量;

    (332.2)解析HTTP头正文内容,每个分隔符换行之后就是表单各控件的输入内容,分号分开的各部分有“name”、“value”、“Content-Disposition”值;如果是文件控件,还会有“filename”、“Content-Type”分别代表在客户电脑存储路径和上传文件类型;将上传文件的内容写入fname.inf;

    (332.3)解析中遇到分界符连上两个“-”,换行之后“ok”,代表HTTP包传输结束;整理(332.2)解析出来的表单内容和新文件的信息写入fname.frm。

    本发明的优点在于:

    1、本发明的服务器端初始化一个新的上传端口Port,将服务器IP和端口Port信息写入状态文件,实例化Socket对象并监听Port端口,表单数据从Port端口传入、由UGiA-PHP-UPLOADER组件的数据端接收处理,这样就脱离了Web服务器对表单上传的控制,摆脱了其对文件长度和传输时间的限制;同时不需要额外的插件就能完成文件的上传。

    2、本发明中分配文件采用自己设计的哈希函数,使计算效率高,并保证对文件夹的均衡分配。

    3、本发明定时请求服务端日志数据,通过DOM接口处理进度条的即时状态显示,支持文件上传进度显示的同时具有良好的可扩展性和可移植性。

    4、本发明中新数据压入队列后,按照RFC1867规范即时解析队列中内容,获得上传状态,写入日志文件,避免了传输结束再处理时需要对整个文件读取造成的时间和资源的浪费。

    【附图说明】

    图1是现有技术RFC1867协议流程;

    图2是本发明总体框架图;

    图3是本发明的总体流程图;

    图4是本发明具体实施例浏览器提交流程图;

    图5是本发明具体实施例客户端控制流程图;

    图6是本发明具体实施例数据端处理流程图;

    图7是本发明具体实施例服务端响应流程图;

    图8是本发明具体实施例五次握手过程流程图。

    【具体实施方式】

    本发明提供的支持进度显示的大文件上传方法,如图2所示涉及四类实体:浏览器,客户控制端,数据接收处理端和服务响应端。

    其中,浏览器包括了所有支持RFC1867、XMLHTTP实现的现今所有主流浏览器,如Internet Explorer、FireFox、Opera。

    客户控制端是内嵌于进度条页面内的软件实体,本发明中一般由Javascript代码构建,负责对上传表单混合数据、与服务器的异步通信和控制进度条显示。

    数据接收处理端指处于Web服务器内,负责接收和解析数据、记录状态文件的软件实体,本发明中一般由C语言代码构建。

    服务响应端指处于Web服务器内,负责回复客户端请求的软件实体,本发明中一般由PHP语言代码构建。

    基于RFC1867上传文件组件一般会受到Web服务器对文件大小和传输时间的限制,对大文件支持不好,本发明通过将数据上传至非http指定端口,由自己的数据处理段进行接收和解析,实现了可移植性好的对大文件支持组件;并且通过异步通信获得实时进度进行显示。

    如图3所示,本发明提供的文件上传方法包括:

    步骤100:浏览器填写内容提交过程。

    步骤200:客户端上传表单数据,与服务响应端通信控制进度显示过程。

    步骤300:数据接收处理端接收上传数据,并按照RFC1867协议解析的过程。

    步骤400:服务响应端度接受客户端请求,按照阶段读取对应的状态文件,将数据返回客户端。

    如图4所示,本实施例的浏览器提交流程图。

    所述浏览器提交过程是指终端用户在浏览器中填写表单内容,然后提交的过程。通过如下步骤实现:

    (101)PC终端用户在浏览器中(IE、Firefox等)打开表单,表单中包含系统需要的基于RFC1867规范的控件,其中File控件必须要有,表单类型(type)属性设置为“multipart/form-data”。

    (102)用户按照控件输入要求填写表单,输入File对象,如果输入错误点击“取消”按钮清除整个表单填写内容。

    (103)填写完毕点击“提交”按钮启动了输入合法性的校验函数,特别是对文件名后坠进行校验以满足系统对文件类型的要求,不合格显示“格式错误”提示,返回(101),合格就打开新页面显示进度条,重要的是给表单返回“false”信号阻断HTTP上传,将混合文件的表单数据控制权交给客户端,进入(201)步骤。

    如图5所示本实施例客户端控制流程图。

    所述客户端控制过程是指客户端负责的向服务器上传数据、与服务端通信以及控制进度显示的过程,此处客户端由Javascript语言构建,内嵌于新打开进度条的页面中。这一过程通过如下步骤实现:

    (201)启动定时器,并初始化XMLHTTP的实例,设置GET方法定时发送异步请求到服务响应端轮询状态,得到端口号信息代表服务端已做好接收数据准备;取得父页面表单对象,设置“action”属性为“http://ip:port”,即设置非80的新上传端口,之后手动“submit”,开始混合文件的表单数据的上传。同时初始化进度条页面:设置抬头信息“开始上传”,显示服务器端口。

    (202)定时请求服务端日志数据,通过DOM接口处理进度条的即时状态显示,包括以下过程:

    (221)在进度条中显示文件相关信息,包括正在上传的文件名和混合数据的长度信息。

    (222)在进度条中显示上传进度信息,包括上传比例、平均速度和剩余时间。

    上传比例处理需要根据返回的当前接收数据长度和文件总长度,计算比值,倍乘以进度条总长度,得到进度即时长度,然后对获得的控件对象长度进行赋值。在这个过程中,还要统计上传速度和剩余时间。前者的计算使用当前接收数据长度与消耗时间的比值,消耗时间在客户端用定时器累加一个全局变量得到;后者的计算,使用剩余数据长度与之前得到的上传速度的比值。速度和时间的数值经过换算成文字表述再显示。比如时间统计以秒为单位,判断其数值大于3600,就整除3600获得小时数,此步余数整除60得到分钟数,余数为秒数。

    (203)接收到的传送完成信号是一个容纳Form表单的数组数据,通过这个数据重组表单的数据项,关键是将file控件替换成值为接收文件存放位置的text控件,然后通过http提交表单,客户端工作结束。

    步骤(201)存在一种非正常中断,用户上传中间点击取消或者关闭进度页面同样导致客户端生命周期结束。

    这个过程中涉及的XMLHTTP,是传送XML格式数据的超文本传输协议;它的数据传输形式非常灵活,通过此协议可以方便地在异构平台之间进行数据交换。目前,绝大多数浏览器都增加了对XMLHTTP的支持,IE中使用ActiveXObject方式创建XMLHTTP对象,其他浏览器,如Firefox,Opera等通过window.XMLHTTPRequest来创建XMLHTTP对象。提到的DOM是文档对象模型(Document Object Model),是一种与浏览器、平台、语言无关的接口,用于开发者访问页面的标准组件。

    如图6所示本实施例数据端处理流程图。

    所述数据端处理过程是指服务器接收、解析混合表单数据,存储数据文件和状态日志的过程,通过如下步骤实现:

    (301)命名上传文件,为了防止冲突不能使用原文件名,采用32位随机数(fname),计算方法是:即时时间叠加随机数,随后用MD5函数运算;确定存储文件夹,文件夹的数目根据系统峰值并发量确定,一般不选择2的幂值,分配文件采用自己设计的哈希函数,具体如下:

    hash(key)=Σi=1key.lengthAscii(key(i))modp]]>

    p≠2ω,ω∈(0,1,2...)

    对文件名中每一位字符的ASCII码求和,其值作为分割的输入;P是根据负载设置的文件夹个数,限制是不能取2的幂;计算效率高并保证对文件夹的均衡分配。

    (302)初始化一个高端随机端口,将服务器IP和端口信息写入fname.srv状态文件,实例化Socket对象并监听此端口,表单数据从这个端口传入、由这个组件的数据端接收处理,这样就脱离了Web服务器对表单上传的控制,同时摆脱了其对文件长度和传输时间的限制。

    (303)遵照HTTP协议编写200的响应头,回复给Post此端口的客户端,随后按照一定字节长度循环读取Socket数据流,压入一定长度的字符队列,包括以下子步骤:

    (331)在循环读取次数是队列长度的整数倍次时,将队列中内容全部顺次写入磁盘数据文件fname.dat。

    (332)新数据压入队列后,按照RFC1867规范即时解析队列中内容,获得上传状态,写入日志文件,避免了传输结束再处理时需要对整个文件读取造成的时间和资源浪费,包括以下子步骤:

    (332.1)解析HTTP头HEAD中内容,获得两部分信息:数据长度和分隔符。前者在数据格式中用“Content-Length”标记,获得后写入fname.con;后者是“Content-Type”标记、并以分号相隔赋值的第二部分,取值存入一个全局变量。

    (332.2)解析HTTP头正文内容,每个分隔符换行之后就是表单各控件的输入内容,分号分开的各部分有“name”、“value”、“Content-Disposition”等值;如果是文件控件,还会有“filename”、“Content-Type”分别代表在客户电脑存储路径和上传文件类型;将上传文件的内容写入fname.inf。

    (332.3)解析中遇到分界符连上两个“-”,换行之后“ok”,代表HTTP包传输结束;整理(332.2)解析出来的表单内容和新文件的信息写入fname.frm。

    如图7所示本实施例服务端响应流程图。

    所述服务端响应过程是指获取状态日志内容,组织数据,回复客户端请求的过程,与数据端处理过程并行进行。通过如下步骤实现:

    (401)服务端读取fname.srv文件,获得服务器和端口信息;客户段得到后提交表单内容到对应端口,初始化进度窗口。

    (402)服务端读取fname.con文件,获得上传混合数据总长度;客户端设置进度条。

    (403)服务端读取fname.inf文件,获得上传文件信息,包括文件名和文件类型;客户端设置进度条。

    (404)服务端计算fname.dat文件长度;客户端以即时长度计算剩余时间等。

    (405)服务端重组fname.frm表单信息,客户端获得form后上传正常的80端口,将控制权柄交给RFC1867处理。

    如图8所示本实施例五次握手过程流程图。

一种基于RFC1867规范的HTTP协议的文件上传方法.pdf_第1页
第1页 / 共15页
一种基于RFC1867规范的HTTP协议的文件上传方法.pdf_第2页
第2页 / 共15页
一种基于RFC1867规范的HTTP协议的文件上传方法.pdf_第3页
第3页 / 共15页
点击查看更多>>
资源描述

《一种基于RFC1867规范的HTTP协议的文件上传方法.pdf》由会员分享,可在线阅读,更多相关《一种基于RFC1867规范的HTTP协议的文件上传方法.pdf(15页珍藏版)》请在专利查询网上搜索。

本发明涉及一种基于RFC1867规范的HTTP协议的文件上传方法,该方法基于UGiA-PHP-UPLOADER组件的系统架构,实现客户端进度控制、服务器端数据接收、按照RFC1867协议的即时解析和状态日志读取,包括:(1)浏览器提交的步骤;(2)客户控制端控制的步骤;(3)服务器端数据接收处理模块处理的步骤;(4)服务器端响应模块响应的步骤。其优点在于:(1)脱离了Web服务器对表单上传的控制,。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 电学 > 电通信技术


copyright@ 2017-2020 zhuanlichaxun.net网站版权所有
经营许可证编号:粤ICP备2021068784号-1