<?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);//创建一个和下载文件名称一致的文件,保存在D盘temp目录下
            }
            
            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) {//确定下载的区间范围,比如0-10000
                    endPoint = contentLength;
                } else {
                    endPoint = startPoint+range;
                }
                var rangeRequest:URLRequest = new URLRequest(videoURL.text);
                var header:URLRequestHeader = new URLRequestHeader("Range", "bytes="+startPoint+"-"+endPoint);//注意这里很关键,我们在请求的Header里包含对Range的描述,这样服务器会返回文件的某个部分
                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();
            }
            
            //http://av.adobe.com/devnet/flex/fiaw/fiaw_v1_01.flv
            
        ]]>
    </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>