以下是測試的情況:
在工作目錄建立 box1 目錄, 裡面包含的檔案: BoxMain-app.xml, BoxMain.as, BoxMain.fla, BoxMain.swf, BoxMainBridge.as。
在工作目錄建立 box2 目錄, 裡面包含的檔案: BoxSub-app.xml, BoxSub.as, BoxSub.fla, BoxSub.swf。
BoxMain.swf 第一個按鈕用來載入文字檔, 第二個按鈕用來載入 BoxSub.swf。
BoxMain.as 的內容:
package { import flash.display.MovieClip; import flash.display.SimpleButton; import flash.text.TextField; import flash.events.Event; import flash.events.MouseEvent; import flash.net.URLRequest; import flash.net.URLLoader; import flash.filesystem.File; import flash.display.Loader; public class BoxMain extends MovieClip { public var y_btn :SimpleButton; public var o_btn :SimpleButton; public var info_txt :TextField; private var loader :Loader; private var file :File; public function BoxMain() { y_btn.addEventListener(MouseEvent.CLICK, yClick, false, 0, true); o_btn.addEventListener(MouseEvent.CLICK, oClick, false, 0, true); // 要取得 application 以外的目錄, 故不直接使用 File.applicationDirectory file = new File(File.applicationDirectory.nativePath); file = file.parent.resolvePath('text.txt'); } public function getFile():File { return file; } public function getURL():String { return file.url; } private function yClick(event:MouseEvent = null):void { trace("file.url: " + file.url); var ur :URLRequest = new URLRequest( file.url ); var ul :URLLoader = new URLLoader; ul.addEventListener(Event.COMPLETE, ulComplete, false, 0, true); ul.load(ur); } private function ulComplete(event:Event):void { info_txt.text = event.currentTarget.data; } private function oClick(event:MouseEvent):void { if(loader) { return; } var swf_file :File = new File( File.applicationDirectory.nativePath); var swf_url :String = swf_file.parent.resolvePath('./box2/BoxSub.swf').url; // var swf_url :String = 'http://dl.dropbox.com/u/9545926/qops.blogspot.tw/2012/BoxSub.swf' loader = new Loader; loader.contentLoaderInfo.parentSandboxBridge = new BoxMainBridge(this); this.addChild( loader ); loader.x = o_btn.x; loader.load(new URLRequest( swf_url )); } } }
BoxMainBridge.as 的內容:
package { import flash.filesystem.File; public class BoxMainBridge { private var main:Object; public function BoxMainBridge (main:Object) { this.main = main; } public function getFile():File { return main.getFile(); } public function getURL():String { return main.getURL(); } } }
BoxSub.as 的內容:
package { import flash.display.MovieClip; import flash.text.TextField; import flash.events.Event; import flash.net.URLRequest; import flash.net.URLLoader; import flash.filesystem.File; public class BoxSub extends MovieClip { public var info_txt :TextField; private var bridge :Object; public function BoxSub() { condition4(); } private function condition1():void { // 被載入時,使用 File 就會發生 SecurityError var file :File = new File(File.applicationDirectory.nativePath); file = file.parent.resolvePath('text.txt'); var url :String = file.url; var ur :URLRequest = new URLRequest(url); var ul :URLLoader = new URLLoader; ul.addEventListener(Event.COMPLETE, ulComplete, false, 0, true); ul.load(ur); } private function condition2():void { // 用完整的 URL 是 OK 的 var url: String = 'file:///C:/Users/shinder/Documents/My Dropbox/current_proj/sandbox_bridge/text.txt'; trace( this, ": " + url); var ur : URLRequest = new URLRequest(url); var ul : URLLoader = new URLLoader; ul.addEventListener(Event.COMPLETE, ulComplete, false, 0, true); ul.load(ur); } private function condition3():void { if(! loaderInfo.parentSandboxBridge) { return; } bridge = loaderInfo.parentSandboxBridge; // SecurityError: filePathAccess var file:File = bridge.getFile(); var url:String = file.url; var ur:URLRequest = new URLRequest(url); var ul:URLLoader = new URLLoader; ul.addEventListener(Event.COMPLETE, ulComplete, false, 0, true); ul.load(ur); } private function condition4():void { if(! loaderInfo.parentSandboxBridge) { return; } bridge = loaderInfo.parentSandboxBridge; trace( "bridge.getURL(): " + bridge.getURL()); var ur:URLRequest = new URLRequest(bridge.getURL()); var ul:URLLoader = new URLLoader; ul.addEventListener(Event.COMPLETE, ulComplete, false, 0, true); ul.load(ur); } private function ulComplete(event:Event):void { info_txt.text = event.currentTarget.data; } } }
結論:
被載入的 BoxSub.swf 屬於不被信任的內容, 所以不能使用 File 類別 (condition1), 也不能透過 sandbox bridge 取得 File 物件 (condition3)。可以透過完整的 URL 取得文字檔內容 (condition2), 呼叫 sandbox bridge 取得 URL 是比較合理的做法。
另外, BoxSub.swf 若放在網路上是不能取得本地端檔案的內容的。
測試檔下載
1 則留言:
如果 BoxSub.swf 放在網路上, BoxMain 可以先將 swf 下載存至本地端 applicationStorageDirectory 裡, 再載入。
張貼留言