この投稿リンクのコードを使用して、リモート 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);
}
}