1

我有一个使用 AS3 和 AIR 的 iOS 应用程序。我有从服务器下载的外部 swfs 并正常播放——所有这些都很好。

不过,我不希望用户每次启动应用程序时都必须下载这些 swf,所以在第一次下载 swf 后,我想将其保存到磁盘。这样我以后需要时可以从本地副本中加载它,而不是再次下载它。我在网上找到了这个在 AS3 中保存文件的例子:

var file:File = File.applicationStorageDirectory.resolvePath("Swfs/" + "mySwfName" + ".swf");
var wr:File = new File(file.nativePath);
var stream:FileStream = new FileStream();
stream.open(wr, FileMode.WRITE);
stream.writeBytes(SWF_FILE_GOES_HERE, 0, SWF_FILE_DATA_LENGTH_GOES_HERE);
stream.close();

问题出在writeBytes一线。我找到的示例是用于将图像保存到磁盘,该行如下所示:

stream.writeBytes(imageData, 0, imageData.length);

但我需要为 swf 而不是图像执行此操作,而且我不确定如何从我的 swf 文件中获取必要的数据。我在网上搜索了保存 swf 文件、从 swf 文件中获取数据等...但我没有找到任何东西。我需要获取 swf 的数据和数据长度(我假设这是字节数?)。以前有没有人解决过这个问题,或者有资源可以为我指明方向?


更新:根据@LondonDrugs_MediaServices 的评论,我想出了这writeBytes条线:

stream.writeBytes(mySwf.loaderInfo.bytes, 0, mySwf.loaderInfo.bytesTotal);

这似乎有效,因为它编译和运行没有错误。但是当我尝试抓取文件并将其放回影片剪辑时,我收到此错误:

Error #2044: Unhandled IOErrorEvent:. text=Error #2035: URL Not Found.

这意味着该文件实际上并未正确保存。但是,当我打印文件位置时,它们似乎是正确的!当我将文件保存到 applicationStorageDirectory 时:

/Users/MyName/Library/Preferences/com.appdir/Local Store/Swfs/mySwName.swf

当我尝试将其从存储中加载到影片剪辑中时的文件名:

/Users/MyName/Library/Preferences/com.appdir/Local Store/Swfs/mySwName.swf

这是我用来尝试将其加载回影片剪辑的代码:

var videoFileName:String = "Swfs/" + ENVAR.currentVideoSelected + ".swf";
var videoFilePath:File = File.applicationStorageDirectory.resolvePath(videoFileName);   
var inFileStream:FileStream = new FileStream(); 
trace("[Loading] filepath: ", videoFilePath.nativePath);
inFileStream.open(videoFilePath, FileMode.READ); 
var fileContents:String = inFileStream.readUTFBytes(inFileStream.bytesAvailable);   
inFileStream.close(); 

var req:URLRequest = new URLRequest(videoFilePath.nativePath);
var mLoader:Loader = new Loader();
mLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, onVideoLoadComplete);
mLoader.load(req);

我的onVideoLoadComplete函数包含以下几行:

var myMC:MovieClip = e.target.content as MovieClip;
addChild(myMC);

但是我收到了错误 2044,它认为该文件不存在。谁能发现问题?谢谢!

4

1 回答 1

2

您可以使用它的 loaderInfo.bytes参数获取加载的 swf 文件的原始字节。因此,对于您的示例,您可以这样做:

var file:File = File.applicationStorageDirectory.resolvePath("Swfs/" + key + ".swf"); 
var wr:File = new File(file.nativePath); 
var stream:FileStream = new FileStream(); 
stream.open(wr, FileMode.WRITE); 
stream.writeBytes(mySwf.loaderInfo.bytes, 0, mySwf.loaderInfo.bytesTotal); 
stream.close(); 

然后将其拉回 MovieClip:

var videoFileName:String = "Swfs/" + ENVAR.currentVideoSelected + ".swf";
var videoFilePath:File = File.applicationStorageDirectory.resolvePath(videoFileName); 
var inFileStream:FileStream = new FileStream(); 
inFileStream.open(videoFilePath, FileMode.READ); 
var swfBytes:ByteArray = new ByteArray();
inFileStream.readBytes(swfBytes);
inFileStream.close(); 

var mLoader:Loader = new Loader();
var loaderContext:LoaderContext = new LoaderContext(false, ApplicationDomain.currentDomain);
loaderContext.allowCodeImport = true;
mLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, onVideoLoadComplete);
mLoader.loadBytes(swfBytes, loaderContext);
于 2012-08-31T22:10:12.170 回答