0

我正在使用此帖子链接中的代码将远程 SWF 文件下载到磁盘。

我有一个列出 3 个 SWF 文件的 XML 文件,并且我使用 for each 循环来遍历它们。跟踪名称,显示所有 3 个唯一文件名。

在 for each 循环中使用文件下载代码时,仅保存列表中的最后一个文件。

我的确切代码:

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);
    }
}

我在想字节数组没有被清除,或者我需要为每个文件使用一个字节数组?

希望你能帮忙。

更新 - 我尝试了以下代码,将完成事件处理程序从循环中取出,仍然有同样的问题,并且正在使用最后一个文件名。在过去的几个小时里一直在尝试各种各样的事情!

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);
            }
        }
4

1 回答 1

0

首先将加载的函数移到循环之外,现在它被多次声明。至于你的问题;在您加载的函数中,您指的是在循环中分配的 urlStream 。在循环结束时,它会将流保存到最后一项,而最后一项将由加载的方法使用。使用传递给加载函数的事件 (event.target) 来获取调度事件的 urlStream。加载函数中的项目也是如此,您需要某种字典设置来获取它。

于 2013-01-04T16:09:16.233 回答