<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"
creationComplete = "init()"
viewSourceURL="srcview/index.html">
<mx:Script>
<![CDATA[
import flash.net.URLLoader;
import flash.net.URLLoaderDataFormat;
import flash.net.URLRequest;
import flash.utils.ByteArray;
[Bindable]
private var progress:Number = 0;
private var contentLength:int = 0;
private var file:File;
private var startPoint:int = 0;
private var endPoint:int = 0;
private var rangeLoader:URLLoader;
private var range:int = 50000;
[Bindable]
private var downloadStatus:Boolean = false;
private function init():void {
var dotSplitLength:uint = videoURL.text.split("/").length; var fileName:String = videoURL.text.split("/")[dotSplitLength-1];
file = new File("D:/temp/"+fileName); }
private function doDownload():void { var getContentLengthRequest:URLRequest = new URLRequest(videoURL.text);
var getContentLengthLoader:URLLoader = new URLLoader();
getContentLengthLoader.addEventListener(ProgressEvent.PROGRESS ,function(e:ProgressEvent):void {
contentLength = getContentLengthLoader.bytesTotal; getContentLengthLoader.close(); downloadByRange(); });
getContentLengthLoader.load(getContentLengthRequest);
}
private function downloadByRange():void { downloadStatus = true;
var fileStr:FileStream = new FileStream();
if(file.exists) { fileStr.open(file, FileMode.READ);
startPoint = fileStr.bytesAvailable; fileStr.close(); }
trace("start:"+startPoint);
if(startPoint+range > contentLength) { endPoint = contentLength;
} else {
endPoint = startPoint+range;
}
var rangeRequest:URLRequest = new URLRequest(videoURL.text);
var header:URLRequestHeader = new URLRequestHeader("Range", "bytes="+startPoint+"-"+endPoint); rangeRequest.requestHeaders.push(header); rangeLoader = new URLLoader();
rangeLoader.dataFormat = URLLoaderDataFormat.BINARY; rangeLoader.addEventListener(Event.COMPLETE ,function(e:Event):void {
var currentData:ByteArray = rangeLoader.data; fileStr = new FileStream();
fileStr.open(file, FileMode.UPDATE);
fileStr.position = fileStr.bytesAvailable; fileStr.writeBytes(currentData, 0, currentData.length); fileStr.close(); progress = endPoint/contentLength * 100; if(progress < 100) {
downloadByRange(); }
});
rangeLoader.load(rangeRequest); }
private function pause():void { downloadStatus = false;
rangeLoader.close();
}
private function open():void {
file.openWithDefaultApplication();
}
]]>
</mx:Script>
<mx:Form x="29" y="26" width="50%" height="309">
<mx:FormItem label="URL">
<mx:TextInput id="videoURL" width="253" text="http://levis.ogilvy.com.cn/hk/media/background.mp3"/>
</mx:FormItem>
<mx:FormItem label="进度">
<mx:Label text="{progress+'%'}"/>
</mx:FormItem>
<mx:FormItem label="Label">
<mx:Button label="下载" click="doDownload();btDownload.visible=false" id="btDownload"/>
</mx:FormItem>
<mx:FormItem label="Label">
<mx:Button label="暂停" visible="{downloadStatus}" click="pause()"/>
<mx:Button label="继续" visible="{!downloadStatus}" click="downloadByRange()"/>
<mx:Button label="打开" visible="{progress==100}" click="open()"/>
</mx:FormItem>
</mx:Form>
</mx:WindowedApplication>