使用Actionscript 3从Facebook加载个人资料图片

时间:2010-10-19 03:54:34

标签: actionscript-3 facebook

我正在尝试使用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将重定向的网址作为解决方法,但这当然远非理想,可能对我的服务器造成很大压力。

7 个答案:

答案 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/