Seven Yu @ 07/23/2010 (12:11 pm)

Flash BitmapData.draw() 的安全沙箱问题

Tags: , , ::

这是今天在开发一个照相功能时遇到的问题, 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.

原始代码:

PLAIN TEXT >> ACTIONSCRIPT:
  1. var img:String = 'http://bbb.com/xxx.jpg';
  2. var loader:Loader = new Loader();
  3. loader.load(new URLRequest(img));
  4. addChild(loader);
  5. var bd:BitmapData = new BitmapData(stage.stageWidth, stage.stageHeight);
  6. bd.draw(stage);

修改代码为:

PLAIN TEXT >> ACTIONSCRIPT:
  1. var img:String = 'http://bbb.com/xxx.jpg';
  2. var loader:Loader = new Loader();
  3. // 定义一个 LoaderContext 对象
  4. var loaderContext:LoaderContext = new LoaderContext();
  5. // 设置 checkPolicyFile 属性为 true, 默认为 false
  6. loaderContext.checkPolicyFile = true;
  7. // 加载时带上这个对象
  8. loader.load(new URLRequest(img), loaderContext);
  9. addChild(loader);
  10. var bd:BitmapData = new BitmapData(stage.stageWidth, stage.stageHeight);
  11. bd.draw(stage);

修改代码后清除缓存刷新页面, 通过 Firebug 可以检测到访问了 http://bbb.com/crossdomain.xml 文件. ( checkPolicyFilefalse 时是不会访问该文件的. )

如果策略文件检测通过就没问题了. 但如果报以下错误, 说明 bbb.comcrossdomain.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 文件一般格式如下:

PLAIN TEXT >> XML:
  1. <cross-domain-policy>
  2. <site-control permitted-cross-domain-policies="master-only"/>
  3. <allow-access-from domain="*.bbb.com" to-ports="80,8080"/>
  4. </cross-domain-policy>

关于 crossdomain.xml 的更多信息可以参考 这里 (PDF)