2012-10-26 25 views
0

我想使这个代码是可恢复的,并再次下载URL的aerray,但我挣扎。该代码似乎只下载最后一个文件,但忽略了第一个文件。我怎样才能使这个代码下载从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> 

回答

0

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

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

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

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

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

相关问题