2013-01-04 46 views
0

我正在使用此帖子中的代碼link here將遠程SWF文件下載到磁盤。循環播放文件列表並下載 - 僅保存最後一個文件

我有一個列出3個SWF文件的XML文件,我使用每個循環來通過它們。追蹤名稱,顯示所有3個獨特的文件名。

在每個循環中使用文件下載代碼時,只保存列表中最後一個文件。

我的確切代碼:

function onPlaylistComplete(e:Event) 
{ 
    var List:XML = new XML(e.target.data); 
    trace("List : " + List); 

    for each(var item in List.playlist_ads.ad.ad_file_path) 
    { 
     var urlString:String = site_url + "/" + item; 
     var urlReq:URLRequest = new URLRequest(urlString); 
     var urlStream:URLStream = new URLStream(); 

     urlStream.addEventListener(Event.COMPLETE, loaded); 
     urlStream.load(urlReq); 

     function loaded(event:Event):void 
     { 
      var fileData:ByteArray = new ByteArray(); 
      urlStream.readBytes(fileData, 0, urlStream.bytesAvailable); 
      writeBinaryFile(item, fileData); 
     } 


    } 
} 

function writeBinaryFile(name : String, array : ByteArray) : void { 
    try { 
     var f : File = File.documentsDirectory.resolvePath(name); 
     var fs : FileStream = new FileStream(); 
     fs.open(f, FileMode.WRITE); 
     fs.writeBytes(array); 
     fs.close(); 
     trace(f.nativePath + " written."); 
    } 
    catch (err : Error) { 
     trace(err.name); 
    } 
} 

我在想,不知何故字節組沒有被清理掉,或者我需要使用每個文件的ByteArray?

希望你能幫上忙。

更新 - 我試了下面的代碼,使完成事件處理程序不在循環中,仍然有相同的問題,並使用最後一個文件名。在過去的幾個小時裏一直在嘗試各種各樣的事情!

for(i = 0; i < adArray.length; i++) 
    { 
     var swfItem = adArray[i]; 
     var urlString:String = site_url + "/" + adArray[i]; 
     var urlReq:URLRequest = new URLRequest(urlString); 
     var urlStream:URLStream = new URLStream(); 

     urlStream.addEventListener(Event.COMPLETE, urlStreamComplete); 
     urlStream.load(urlReq); 


    } 
    function urlStreamComplete(event:Event):void 
     { 
      var fileData:ByteArray = new ByteArray(); 
      var stream = event.target; 
      stream.readBytes(fileData, 0, stream.bytesAvailable); 
      try { 
       var f : File = File.documentsDirectory.resolvePath(swfItem); 
       var fs : FileStream = new FileStream(); 
       fs.open(f, FileMode.WRITE); 
       fs.writeBytes(fileData); 
       fs.close(); 
       trace(f.nativePath + " written."); 
      } 
      catch (err : Error) { 
       trace(err.message); 
      } 
     } 

回答

0

首先將加載的函數移動到循環外部,現在它被多次聲明。至於你的問題;在你的加載函數中,你指的是在循環內分配的urlStream。在循環結束時,它會將流保存到最後一個項目,然後將被加載的方法使用。使用傳遞給您的加載函數的event(event.target)來獲取調度該事件的urlStream。加載函數中的項目也是如此,您需要某種字典設置才能獲取它。

+0

你能提供一些代碼來展示你的意思嗎?我不太熟悉AS3,我很害怕! –

相關問題