我正在尝试使用AS3从Facebook加载个人资料图片(朋友图片),但我似乎遇到了安全问题。
我目前正在使用“官方”Adobe Facebook API for Actionscript 3,它运行正常。但是,在浏览器中运行我的应用程序时,我似乎无法加载配置文件图像。在Flash IDE中运行时,图像加载正常。
正在从https://graph.facebook.com
加载图片,并且该域上似乎存在crossdomain.xml策略:
<!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
<allow-access-from domain="*" secure="false" />
<site-control permitted-cross-domain-policies="master-only" />
</cross-domain-policy>
在其他来源中,我发现在加载图像时向我的Loader对象添加一个ContextLoader应该可以解决问题,但这似乎也不是这样:
loader = new Loader();
// add some listeners here...
loader.load( new URLRequest( "imageurl" ), new LoaderContext(true) );
我现在还不太清楚该怎么办。我希望Adobe Facebook API可以提供帮助,但我似乎无法找到解决这个问题的任何东西。
非常感谢任何帮助。
更新
我刚注意到,当我在浏览器中访问其中一个图像时,我实际上已将其重定向到存储实际图像的Facebook的CDN。当我使用重定向的URL对图像URL进行硬编码时,我可以在浏览器中加载图像。除了重定向问题之外,这似乎不是一个安全问题。
如果这是重定向问题,那么问题就会变成;如何让Flash Player从重定向的URL加载图像?
更新2:
似乎URLRequest类具有followRedirects
属性,该属性仅在AIR中可用。
更新3:
我目前正在使用PHP script将重定向的网址作为解决方法,但这当然远非理想,可能对我的服务器造成很大压力。
答案 0 :(得分:11)
我遇到了同样的问题,看起来您必须手动加载您在actionscript中重定向到的域的跨域文件。目前,看起来所有的Facebook个人资料图片最终都是从域http://profile.ak.fbcdn.net/加载的。
我刚刚在加载图片之前添加了这一行:
Security.loadPolicyFile("http://profile.ak.fbcdn.net/crossdomain.xml");
只要重定向域不变,这应允许加载重定向的图像。 ;)
答案 1 :(得分:2)
您可以使用URLLoader并将图像作为ByteArray加载。无论重定向如何,这似乎都有效。然后,您可以使用ByteArray作为Image / BitmapImage的源,或者使用Loader来加载字节,就像您首先使用图像URL一样。
例如:
var urlRequest:URLRequest = new URLRequest("http://graph.facebook.com/id/picture");
var urlLoader:URLLoader = new URLLoader();
urlLoader.dataFormat = URLLoaderDataFormat.BINARY;
urlLoader.addEventListener(Event.COMPLETE, completeHandler);
urlLoader.load(urlRequest);
function completeHandler(event:Event):void
{
var byteArray:ByteArray = loader.data;
// Then either:
bitmapImage.source = byteArray;
// or:
var loader:Loader = new Loader();
...
loader.loadBytes(byteArray);
...
}
答案 2 :(得分:1)
它应该是一件非常容易的事情,所有的facebook个人资料图片都可以通过使用图API的图片根来找到。喜欢这个链接:
“http://graph.facebook.com/”+ userid +“/ picture”
答案 3 :(得分:1)
我想在这里确认马丁的解决方案。
我的案例来自在AIR平台上测试应用程序,这很好并且效果很好,图像加载成功。
但是当我将它移植到Facebook上的画布应用程序时,我遇到了问题,配置文件图像不会出现,无法加载。
我在这里使用马丁的建议。如果您跟踪网址重定向,您会看到实际上图像配置文件位于该CDN服务器而不是Facebook本身,因此您需要根据actionscript的security-sandbox加载该域的策略文件。
再次感谢。
答案 4 :(得分:0)
完全猜测,但您可以使用URLLoader从重定向的调用中获取数据,然后将其一起解析为图片xD
答案 5 :(得分:0)
我正在使用两个loadPolicyFile调用,因为似乎有两个可能的Facebook使用的CDN。这对我有用,但当然,通用的解决方案更可取,facebook可能会再次添加另一个CDN,而事情就会停止自己的工作 -
Security.loadPolicyFile('http://profile.ak.fbcdn.net/crossdomain.xml');
Security.loadPolicyFile('http://profile.cc.fbcdn.net/crossdomain.xml');
@Stiggler建议的URLLoader解决方案可能有效。我没试过。但与使用Loader对象相比,它似乎更重。
答案 6 :(得分:0)
由于Facebook存储了许多照片,我编写了一个小脚本,使用图片的域来加载相应的策略文件:
import com.adobe.net.URI;
import flash.system.Security;
var someFacebookImageUrl:String = "https://fbcdn-profile-a.akamaihd.net/hprofile-ak-ash3/c66.66.828.828/s160x160/537210_440478782684964_233907781_n.jpg";
var uri:URI = new URI(someFacebookImageUrl);
Security.loadPolicyFile(uri.scheme + "://" + uri.authority + "/crossdomain.xml");
很好,这不仅适用于个人资料图片,也适用于Facebook使用的所有图片。
希望这有助于你们中的一些人!
PS:URI类是as3核心库的一部分:http://code.google.com/p/as3corelib/