我目前正在通过as3加载远程swf(使用域策略允许来自该域的所有内容 - 我自己无法更改策略文件),我想拍摄快照。问题是我加载的主要swf是从另一个没有启用允许所有策略的域加载子swf ..这使得快照功能调用“沙盒安全性”错误。我想知道是否有替代bitmapdata draw函数仍然可以拍摄“快照”而不会破坏沙箱的安全性。
提前致谢。
答案 0 :(得分:2)
如果您被允许从相关域中加载数据,请执行以下操作:
之后你应该能够draw()
swf的内容。
编辑此技术的示例。
只需将下面的代码复制并粘贴到空白文件中,编译并将生成的swf放在http的某处(当在本地测试时,两个draw()调用都会成功,所以你不会看到差异)。
import flash.net.URLLoader;
import flash.net.URLLoaderDataFormat;
import flash.net.URLRequest;
import flash.events.Event;
import flash.utils.ByteArray;
import flash.display.Loader;
import flash.display.LoaderInfo;
import flash.system.Security;
import flash.display.BitmapData;
import flash.display.Bitmap;
import flash.text.TextField;
import flash.display.StageScaleMode;
var onBinaryComplete:Function = function (event:Event) : void
{
trace("onBinaryComplete()");
var loader:URLLoader = event.target as URLLoader;
var bytes:ByteArray = loader.data as ByteArray;
trace(bytes.length+" bytes");
bytesLoader.loadBytes(bytes);
}
var onBytesComplete:Function = function (event:Event) : void
{
trace("onBytesComplete()");
var info:LoaderInfo = event.target as LoaderInfo;
var bmp:BitmapData = new BitmapData(300, 300, true, 0x8000FF00);
// this will not fail, you'll see an image
bmp.draw(info.content);
var bitmap = new Bitmap(bmp);
bitmap.x += 100;
bitmap.y += 100;
stage.addChild(bitmap);
}
var onDirectLoadComplete:Function = function (event:Event) : void
{
trace("onDirectLoadComplete()");
var bmp:BitmapData = new BitmapData(300, 300, true, 0x80FF0000);
// this must fail, you'll get an exception
bmp.draw(event.target.content);
stage.addChild(new Bitmap(bmp));
}
var binaryLoader:URLLoader = new URLLoader();
binaryLoader.dataFormat = URLLoaderDataFormat.BINARY;
binaryLoader.addEventListener(Event.COMPLETE, onBinaryComplete);
binaryLoader.load(new URLRequest("http://noregret.org/test/wrk.swf"));
var bytesLoader:Loader = new Loader();
bytesLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, onBytesComplete);
var directLoader:Loader = new Loader();
directLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, onDirectLoadComplete);
directLoader.load(new URLRequest("http://noregret.org/test/wrk.swf"));
加载数据crossdomain.xml:http://noregret.org/crossdomain.xml,但在直接加载时无法控制加载的swf内容。加载字节然后内容解决了问题。
答案 1 :(得分:1)
这几乎就是沙箱的用途。因此,您无法从您不拥有的数据创建快照。这是一个蹩脚的答案,但as the docs point out,解决它的唯一方法是使用AIR。
如果您有权访问其他域,或者您知道控制它的人,则可以在其网站上放置crossdomain.xml。
答案 2 :(得分:0)
您可以通过某个代理(托管在您自己的服务器上)加载资产。许多托管公司不允许托管任何代理脚本,即使它是为应用程序加载资产。