捕获外部swf和SecurityDomain的框架

时间:2012-03-22 08:34:59

标签: actionscript-3 flash flex actionscript

有没有办法将帧捕获为加载了与主应用程序不同的安全域的swf的位图?

2 个答案:

答案 0 :(得分:0)

如果所有内容都在同一个BitmapData内,则使用draw(IDrawable)的{​​{1}}函数非常简单。

只有当您尝试呈现的每个已加载元素的SecurityDomain接受发出请求的代码的域(可能是swf的域)时,才可以使用此技术。

查看BitmapData.draw(IDrawable)的文档。它表示在以下情况下会抛出SecurityDomain

  

源对象和(在Sprite或MovieClip对象的情况下)   它的所有子对象都不是来自同一个域   呼叫者,或者不在呼叫者可以访问的内容中   调用了Security.allowDomain()方法。这个限制呢   不适用于应用程序安全沙箱中的AIR内容。

这样做的结果是,如果您使用标准SecurityError从您无法控制的域加载内容,则无法创建包含该内容的任何DisplayObjectContainer的Bitmap“快照”(除非它碰巧允许从所有域或您的域明确访问)。如果您执行控制域,则应该能够通过使用crossdomain.xml(对于非swf内容)或Loader调用swf内容来使其工作。加载的swf必须进行Security.allowDomain()调用。

(另外,如果您只是想获取包括来自其他域的静态图像的快照,例如JPG或GIF,您可以直接加载图像数据,并使用适当的AS3解码器将其解码为Bitmap(而不是而不是使用标准allowDomain),它允许您获取它的位图快照。)

答案 1 :(得分:0)

简答:不。 但是,如果您可以访问任何服务器端技术(例如部署swf的PHP),则可以使用解决方法。修复是使用PHP为您代理图像。 PHP脚本使用cUrl加载图像,yuor swf能够加载它们,因为它们来自同一个域。

以下是一个简单代理脚本的示例。在生产环境中,您应该强化脚本以防止未经授权的用户访问它。

<?php

$post_data = $HTTP_RAW_POST_DATA;

$header[] = "Content-type: text/xml";
$header[] = "Content-length: ".strlen($post_data);

$ch = curl_init( $_GET['path'] ); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);

if ( strlen($post_data)>0 ){
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
}

$response = curl_exec($ch);     
$response_headers = curl_getinfo($ch);     

if (curl_errno($ch)) {
    print curl_error($ch);
} else {
    print_r(curl_getinfo($ch));
    curl_close($ch);
    header( 'Content-type: ' . $response_headers['content-type']);
    print $response;
}


?>