2012-10-26 3 views
0

이 코드를 다시 시작할 수있게 만들고 URL을 다시 다운로드하려고합니다.하지만 고생하고 있습니다. 코드는 마지막 파일을 다운로드하는 것으로 보이지만 첫 번째 파일은 무시합니다.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이 필요하므로 전역 범위가 아닌 함수의 범위 내에서 파일을 만들어야합니다.

COMPLETE 또는 PROGRESS 이벤트에서 URLLoader를 가져와야하는 경우 event.currentTarget 및 event.Target을 확인하십시오.

동시에 실행하지 않으려면 COMPLETE 핸들러 내에서 수동으로 증가시키고 count 속성을 사용하여 배열의 다음 항목을 가져 오는 "count"변수를 가질 수 있습니다.