0

我正在尝试使此代码可恢复并再次下载一系列 URL,但我很挣扎。该代码似乎只下载了最后一个文件,但忽略了第一个文件。

<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" applicationComplete="init(event)" viewSourceURL="srcview/index.html">
    <mx:Script>
        <![CDATA[


            import flash.events.Event;
            import flash.events.ProgressEvent;
            import flash.net.URLRequest;
            import flash.net.URLStream;
            import flash.utils.ByteArray;
            import mx.controls.Alert;
            import mx.events.FlexEvent;

            //Declear variables
            private var urlStream:URLStream;
            private var fData:ByteArray;
            private var bytesLoaded:Number = 0;
            private var totalBytesLoaded:Number = 0;
            private var bytesTotal:Number = 0;
            private var fileName:String = "";
            private var file:File;
            private var fileStream:FileStream = new FileStream;

            //initialize even listeners
            protected function init(event:FlexEvent):void{
                urlStream = new URLStream;
                urlStream.addEventListener(ProgressEvent.PROGRESS, onProgress);
                urlStream.addEventListener(Event.COMPLETE, onComplete);


                var letters:Array = ["http://www.khanhvanweb.com/Music/Spanish Guitar Toni Braxton.mp3","http://dropthebeat.tv/audio/ToniBraxton-Please.mp3"];

                for (var i:int = 0; i < letters.length; i++) {
                    trace("Element " + i + ": " + letters[i]);
                    fileInput.text = letters[i];

                startDownload();
                }

            }

            //Start Downloaing

        //  if (fileInput.text = ""){


            public function startDownload():void{
                bytesLoaded = 0;
                bytesTotal = 0;
                totalBytesLoaded = 0;

                var url:String = fileInput.text;
                var index:int = url.lastIndexOf('/');
                fileName = url.substring(index+1, url.length);

                var str1:String = "/Music/ClassicalShop.Net/";

            //  file = File.documentsDirectory.resolvePath(fileName);
                //'Save to classical muic directory
                file = File.userDirectory.resolvePath(String(File.userDirectory.url + str1 + fileName));

                status = file.url;

                if(file.exists) {
                    btn.label = 'Download';
                    mx.controls.Alert.show('Please remove "'+fileName+'" from your disk', 'File with the same name already exists');
                    return;
                }

                output.text += 'Downloading\n';

                urlStream.load( new URLRequest(url) );
                fData = new ByteArray;
                fileInput.enabled = false;

                fileStream.open(file, file.exists ? FileMode.APPEND:FileMode.WRITE); }


        //  }




            private function pauseDownload():void {
                output.text += 'Downloading is paused\n';
                if(urlStream.connected) {
                    fData.clear();
                    urlStream.readBytes(fData, fData.length);
                    urlStream.close();
                    fileStream.writeBytes(fData);

                    }

                fileStream.close();

                totalBytesLoaded += bytesLoaded;
                trace( "pause size:"+ totalBytesLoaded);

                }



            //Resume the Download
            private function resumeDownload():void {
                output.text += 'Downloading \n';
                output.text +='bytes='+totalBytesLoaded+'-'+bytesTotal + '\n';
                var header0:URLRequestHeader = new URLRequestHeader('range', 'bytes='+totalBytesLoaded+'-'+bytesTotal);

                var request:URLRequest = new URLRequest(fileInput.text);
                request.requestHeaders.push(header0);

                urlStream.load( request );

                fileStream.open(file, file.exists ? FileMode.APPEND:FileMode.WRITE);
                }

            //Set progress of the file download
            private function onProgress(event:ProgressEvent):void {
                bytesLoaded = event.bytesLoaded;
                if(bytesTotal == 0)
                    bytesTotal = event.bytesTotal;

                trace( "size:"+ bytesLoaded);

                progressBar.setProgress( (totalBytesLoaded + event.bytesLoaded) / bytesTotal, progressBar.maximum);

                if(urlStream.bytesAvailable == 0) return;
                if(urlStream.connected)
                    {
                    fData.clear();
                    urlStream.readBytes(fData, fData.length);
                    fileStream.writeBytes(fData);

                    }
                }

            //Action to take when the file has completed downloading
            private function onComplete(event:Event):void
                {
                output.text += 'Download complete\n';
                bytesLoaded = 0;
                bytesTotal = 0;
                totalBytesLoaded = 0;
                progressBar.setProgress(0, 1);

                if(urlStream.connected)
                    {
                    fData.clear();
                    urlStream.readBytes(fData, fData.length);
                    urlStream.close();
                    fileStream.writeBytes(fData);
                    }

                fileInput.enabled = true;
                btn.label = 'Download';
                fData = null;

                fileStream.close();

                System.gc();
                }


            //write the file to disk
            private function writeFile():void
                {


                output.text += 'Saving File\n';
                var fileStream:FileStream = new FileStream;
                fileStream.open(file, file.exists ? FileMode.APPEND:FileMode.WRITE);
                fileStream.writeBytes(fData);
                fileStream.close();
                output.text += 'File Saved\n';


                }


            private function btnClickHandler():void
                {

                if(bytesLoaded == 0)
                    {
                    btn.label = 'Pause';


                    startDownload();
                    }
                    else
                        {
                        if(urlStream.connected)
                            {
                            btn.label = 'Resume';
                            pauseDownload();
                            }
                            else
                                {
                                btn.label = 'Pause';
        resumeDownload();
    }}}
        ]]>
    </mx:Script>
    <mx:TextInput id="fileInput" y="15" left="67" right="10"/>
    <mx:Button id="btn" x="286" y="65" label="Download" click="btnClickHandler()"/>
    <mx:ProgressBar id="progressBar" x="67" y="65" 
                    mode="manual" minimum="0" maximum="1" label="Downloading %3%%"/>
    <mx:Label x="10" y="20" text="File URL"/>
    <mx:TextArea id="output" left="10" right="10" top="107" bottom="10"/>
    <mx:Button y="65" label="Clear Input" right="10" 
               enabled="{fileInput.text.length==0 ? false:fileInput.enabled}"
               click="fileInput.text = ''"/>
    <mx:Label x="67" y="46" 
              text="http://www.example.com/downloads/episode77.mp3" 
              color="#878787"/>
</mx:WindowedApplication>
4

2 回答 2

0

我不确定您是否在移动平台上尝试,但我们刚刚在 Android 上发布了我们新的 air 原生扩展,它是一个可恢复的多部分下载管理器。在这里查看:http: //myappsnippet.com/download-manager-air-native-extension/

于 2014-05-07T05:36:27.320 回答
0

这是因为您使用的是全局变量。当您启动一个新的 URLLoader/URLStream 时,它会关闭任何先前的请求并从新的请求开始。解决方案很简单。

public function startDownload( urlRequest:URLRequest ):void{
    var loader:URLLoader = new URLLoader();
    loader.load( urlRequest );
}

显然,这只是基础知识,您需要添加其余代码,但您明白了。对于每个单独的文件,您需要一个完全独立的 URLRequest 和 URLLoader/URLStream,因此您必须在函数范围内创建它们,而不是在全局范围内。

如果您需要在 COMPLETE 或 PROGRESS 事件中获取 URLLoader,请查看 event.currentTarget 和 event.Target。

如果您不希望它们同时运行,您可以在 COMPLETE 处理程序中手动增加一个“计数”变量,并使用该计数属性来获取数组中的下一项。

于 2012-10-26T16:09:36.740 回答