HTTP断点续传原理及Flex实现技术_第1页
HTTP断点续传原理及Flex实现技术_第2页
HTTP断点续传原理及Flex实现技术_第3页
HTTP断点续传原理及Flex实现技术_第4页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、HTTP断点续传原理及Flex实现技术 研发中心 王秀珍一、Http断点续传原理现在基本上任何一个下载工具都是支持断点续传的,抛开P2P的成分不谈,我们单说通过HTTP服务器是如何实现断点续传的。关键在于你向HTTP服务器发起文件请求的时候,是否明确的告知,要下载文件的哪个区域,我们都知道HTTP请求是有一个Header的,实际上里面有个属性是定义下载的区域的,这个属性就是Range,它接收的值是一个区间范围,比如:Range:bytes=0-10000这样我们就可以按照一定的规则,将一个大文件拆分为若干很小的部分,然后分批次的下载,每个小块下载完成之后,都合并到文件中,这样即时中间中断了下载

2、,我们重新开始下载的时候,也可以通过文件的字节长度来判断下载的起始点,然后重启断点续传的过程,直到最后完成下载过程。1、 下面是非断点续传的Http剖析假设我们通过浏览器去下载一个名称为hello.zip的文件。那么浏览器发出的请求信息如下:GET /hello.zip HTTP/1.1Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/msword, application/vnd.ms-powerpointAccept-Language: zh-

3、cnAccept-Encoding: gzip, deflateUser-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)Connection: Keep-Alive服务器收到请求后,按要求寻找请求的文件,提取文件的信息,然后返回给浏览器,返回信息如下:200Content-Length=106786028Accept-Ranges=bytesDate=Mon, 30 Apr 2009 12:56:11 GMTETag=W/"02ca57e173c12:95b"Content-Type=applicatio

4、n/octet-streamLast-Modified=Mon, 30 Apr 2009 12:56:11 GMT2、下面是断点续传的http剖析如果自己编的一个客户端程序来传递请求信息给Web服务器,要求从1000070字节开始。GET /hello.zip HTTP/1.0推荐精选User-Agent: NetFoxRANGE: bytes=1000070-Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2仔细看一下就会发现多了一行RANGE: bytes=1000070-,这一行的意思就是告诉服务器hello.zip这

5、个文件从1000070字节开始传,前面的字节不用传了。服务器收到这个请求以后,返回的信息如下:206Content-Length=106786028Content-Range=bytes 1000070-106786027/106786028Date=Mon, 30 Apr 2009 12:55:20 GMTETag=W/"02ca57e173c12:95b"Content-Type=application/octet-streamLast-Modified=Mon, 30 Apr 2009 12:55:20 GMT和前面服务器返回的信息比较一下,就会发现增加了Conten

6、t-Range一行,且返回的代码也改为206了,而不再是200了。以上就是HTTP断点续传的原理,具体通过什么技术实现,比如Java、C+、Flex等,都可以实现。二、Flex实现的文件下载断点续传下面是基于AS3+Flash Player+AIR,制作一个断点续传的小程序,大概实现思路如下:1、首先对文件发起请求,得到文件的尺寸(字节长度),但并不下载2、然后将文件划分为若干区域,对第一个区域的内容发起请求(通过指定HTTP头的Range)3、第一个区域的内容很快下载完成,使用File保存到本地文件4、移动指针,对第二个区域的内容发起请求,下载完毕后与文件合并5、以此类推,直到下载完成整个文

7、件以下是实现代码:<?xml version="1.0" encoding="utf-8"?><mx:WindowedApplication xmlns:mx=" layout="absolute" title="梦想下载" > <mx:Script> <!CDATA import .URLLoader; import .URLStream; import .URLRequest; import flash.utils.ByteArray; import mx.c

8、ontrols.Alert; private var contentLength:int = 0; private var file:File;推荐精选 private var startPoint:int = 0; private var endPoint:int = 0; private var rangeStream:URLStream; private var isInit:Boolean = false; private var range:int = 1024000; /每次下载的字节数, private var currentData:ByteArray; private var

9、 progress:Number = 0; private function init():void var dotSplitLength:uint = videoURL.text.split("/").length;/这两行代码是为了获取下载文件的名称 var fileName:String = videoURL.text.split("/")dotSplitLength-1; file = new File("C:/DownLoadTemp/"+fileName);/创建一个和下载文件名称一致的文件,保存在D盘temp目录下 is

10、Init = true; private function doDownload():void /先发送一个下载请求,可以得到文件的真实尺寸 var getContentLengthRequest:URLRequest = new URLRequest(videoURL.text); var getContentLengthLoader:URLLoader = new URLLoader(); getContentLengthLoader.addEventListener(ProgressEvent.PROGRESS ,function(e:ProgressEvent):void conten

11、tLength = getContentLengthLoader.bytesTotal;/得到文件的真实尺寸 getContentLengthLoader.close();/停止下载 downloadByRange();/按照断点续传的方式下载 ); getContentLengthLoader.load(getContentLengthRequest); private function downloadByRange():void /按照断点续传的方式下载 if(!isInit) init(); var fileStr:FileStream = new FileStream(); if(f

12、ile.exists) /如果文件是存在的,就说明下载过,需要计算从哪个点开始下载 fileStr.open(file, FileMode.READ); startPoint = fileStr.bytesAvailable;/计算从哪个点开始下载 fileStr.close();/关闭文件流 endPoint = startPoint+range>contentLength?contentLength:startPoint+range; if(startPoint=contentLength) 推荐精选 Alert.show("您已经完成了下载"); return;

13、 var rangeRequest:URLRequest = new URLRequest(videoURL.text); var header:URLRequestHeader = new URLRequestHeader("Range", "bytes="+startPoint+"-"+endPoint);/注意这里很关键,我们在请求的Header里包含对Range的描述,这样服务器会返回文件的某个部分 rangeRequest.requestHeaders.push(header);/将头信息添加到请求里 rangeStream

14、 = new URLStream(); rangeStream.addEventListener(Event.COMPLETE ,function(e:Event):void var bytesLength:int = rangeStream.bytesAvailable; currentData = new ByteArray(); rangeStream.readBytes(currentData, 0, bytesLength); /得到下载的数据 fileStr = new FileStream(); fileStr.open(file, FileMode.UPDATE); fileS

15、tr.position = fileStr.bytesAvailable;/将指针指向文件尾 fileStr.writeBytes(currentData, 0, currentData.length);/在文件中写入新下载的数据 fileStr.close();/关闭文件流 progress = endPoint/contentLength * 100;/计算下载进程 bar.setProgress(progress,100); bar.label= "Progress" + " " + progress + "%" if(endP

16、oint < contentLength) downloadByRange();/如果下载没有完成,则执行下一个断点下载,直到下载完毕整个文件 ); rangeStream.load(rangeRequest);/发起请求 private function pause():void /暂停下载 if(rangeStream!=null&&rangeStream.connected) rangeStream.close(); > </mx:Script> <mx:Canvas width="494" height="28

17、4" horizontalCenter="0" verticalCenter="0"> <mx:Label x="21" y="87" text="下载地址" width="53" fontSize="12" /> <mx:TextInput x="82" y="87" width="399" id="videoURL" text="

18、31:8080/FlexChatServer/AContreCourant.avi"/> <mx:Button x="160" y="141" label="下载" id="btDownload" fontSize="12" click="doDownload();btDownload.enabled=false;btPause.enabled=true;btContinue.enabled=false"/>推荐精选 <mx:Button x="221" y="141" label="暂停" id="btPause" fontSize="12" enabled="false" click="pause();btPause.enabled=false;btContinue.enabled=true"/> <mx:Button x="281" y=&q

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论