Flash BitmapData.draw() 的安全沙箱问题
这是今天在开发一个照相功能时遇到的问题, flash 中加载了外站的图片, 在执行 BitmapData.draw() (被绘制区域包含图片元素) 时报了以下错误:
SecurityError: Error #2122: Security sandbox violation: BitmapData.draw: http://aaa.com/xxx.swf cannot access http://bbb.com/xxx.jpg. A policy file is required, but the checkPolicyFile flag was not set when this media was loaded.
原始代码:
-
var img:String = 'http://bbb.com/xxx.jpg';
-
var loader:Loader = new Loader();
-
loader.load(new URLRequest(img));
-
addChild(loader);
-
var bd:BitmapData = new BitmapData(stage.stageWidth, stage.stageHeight);
-
bd.draw(stage);
修改代码为:
-
var img:String = 'http://bbb.com/xxx.jpg';
-
var loader:Loader = new Loader();
-
// 定义一个 LoaderContext 对象
-
var loaderContext:LoaderContext = new LoaderContext();
-
// 设置 checkPolicyFile 属性为 true, 默认为 false
-
loaderContext.checkPolicyFile = true;
-
// 加载时带上这个对象
-
loader.load(new URLRequest(img), loaderContext);
-
addChild(loader);
-
var bd:BitmapData = new BitmapData(stage.stageWidth, stage.stageHeight);
-
bd.draw(stage);
修改代码后清除缓存刷新页面, 通过 Firebug 可以检测到访问了 http://bbb.com/crossdomain.xml 文件. ( checkPolicyFile 为 false 时是不会访问该文件的. )
如果策略文件检测通过就没问题了. 但如果报以下错误, 说明 bbb.com 的 crossdomain.xml 文件定义了许可(或禁止)访问的域名
SecurityError: Error #2123: Security sandbox violation: BitmapData.draw: http://aaa.com/xxx.swf cannot access http://bbb.com/xxx.jpg. No policy files granted access.
crossdomain.xml 文件一般格式如下:
-
<cross-domain-policy>
-
<site-control permitted-cross-domain-policies="master-only"/>
-
<allow-access-from domain="*.bbb.com" to-ports="80,8080"/>
-
</cross-domain-policy>