我正在使用此帖link here中的代码将远程SWF文件下载到磁盘。
我有一个XML文件列出了3个SWF文件,我正在使用每个循环来完成它们。追踪名称,显示所有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,或者我需要为每个文件使用一个bytearray?
希望你能提供帮助。
UPDATE - 我尝试了以下代码,将完成事件处理程序排除在循环之外,仍然存在相同的问题,并且正在使用最后一个文件名。在过去的几个小时里一直在尝试各种各样的事情!
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 :(得分:0)
首先将加载的函数移动到循环外部,现在它被多次声明。至于你的问题;在你加载的函数中,你正在引用在循环中分配的urlStream。在循环结束时,它将流保存到最后一个项目,而最后一个项目将由加载的方法使用。使用传递给已加载函数的事件(event.target)来获取调度事件的urlStream。对于加载函数中的项目也是如此,您需要某种字典设置来获取它。