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 に答える