我有一个在本地运行良好的 swf (AS3),但是当我将 swf 放在服务器上并在浏览器中运行时,它在尝试使用 draw 方法时崩溃:
var bmp:BitmapData=new BitmapData(ldr.width,ldr.height,true,0x00FFFFFF);
bmp.draw(ldr);
ldr 是一个加载器,此时已成功从其他服务器加载了 jpg。我可以将 ldr 添加到舞台并查看图像。到底是怎么回事?
我有一个在本地运行良好的 swf (AS3),但是当我将 swf 放在服务器上并在浏览器中运行时,它在尝试使用 draw 方法时崩溃:
var bmp:BitmapData=new BitmapData(ldr.width,ldr.height,true,0x00FFFFFF);
bmp.draw(ldr);
ldr 是一个加载器,此时已成功从其他服务器加载了 jpg。我可以将 ldr 添加到舞台并查看图像。到底是怎么回事?
确保另一台服务器上的 crossdomain.xml 正确。
您必须将checkPolicyFile
(LoaderContext
该方法的第二个(可选)参数load()
)设置true
为以访问bitmapData
从远程域加载的图像的 。
var loader:Loader = new Loader();
var context:LoaderContext = new LoaderContext(true);
loader.load(urlRequest, context)
使用类的
load()
方法加载图片时Loader
,可以指定一个context
参数,就是一个LoaderContext
对象。如果checkPolicyFile
将对象的属性设置LoaderContext
为 true,Flash Player 会在从中加载图像的服务器上检查跨域策略文件。如果存在跨域策略文件,并且该文件允许加载的SWF文件所在的域,则允许该文件访问Bitmap
对象中的数据;否则,访问被拒绝。
LoaderContext::checkPolicyFile
当您从调用 SWF 文件自己的域之外加载图像(JPEG、GIF 或 PNG)时,将此标志设置为 true,并且您希望需要从 ActionScript 访问该图像的内容。访问图像内容的示例包括引用 Loader.content 属性以获取 Bitmap 对象,以及调用 BitmapData.draw() 方法以获取已加载图像像素的副本。如果您在加载时未指定 checkPolicyFile 就尝试这些操作之一,您可能会收到 SecurityError 异常,因为尚未下载所需的策略文件。
如果加载的内容是图像,则安全沙箱之外的 SWF 文件无法访问其数据,除非该 SWF 文件的域包含在图像源域的跨域策略文件中。
注意:源对象和(在 a
Sprite
或MovieClip
对象的情况下)其所有子对象必须来自与调用方相同的域,或者必须位于调用方可通过调用Security.allowDomain()
方法访问的 SWF 文件中。如果不满足这些条件,则该draw()
方法不会绘制任何内容并引发SecurityError
异常。此限制不适用于应用程序安全沙箱中的 AIR 内容。