代码之家  ›  专栏  ›  技术社区  ›  Luke

使用ActionScript3从Facebook加载配置文件图像

  •  13
  • Luke  · 技术社区  · 14 年前

    我试图用AS3从Facebook加载个人资料图片(朋友图片),但我似乎遇到了安全问题。

    Adobe Facebook API 对于运行良好的ActionScript3。但是,在浏览器中运行应用程序时,我似乎在加载配置文件映像时遇到问题。在Flash IDE中运行时,图像加载良好。

    正在从加载图像 https://graph.facebook.com

    <!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时,我可以在浏览器中加载图像。看来这毕竟不是安全问题,而是重定向问题。

    更新2:

    URLRequest类似乎有一个 followRedirects

    更新3:

    PHP script 为了让我得到重定向的网址作为一个解决办法,但这当然是远远不够理想的,可能会对我的服务器造成很大的压力。

    7 回复  |  直到 14 年前
        1
  •  11
  •   martin    14 年前

    我也遇到了同样的问题,看起来您必须手动加载在actionscript中重定向到的域的跨域文件。目前看来,所有的facebook个人资料图片最终都是从该域加载的 http://profile.ak.fbcdn.net/ .

    Security.loadPolicyFile("http://profile.ak.fbcdn.net/crossdomain.xml");
    

    只要重定向域不变,就可以加载重定向的映像。;)

        2
  •  2
  •   Stiggler    14 年前

    例如:

    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);
       ...
    }
    
        3
  •  1
  •   longstaff    14 年前

    “http://graph.facebook.com/”+userid+“/图片”

        4
  •  1
  •   haxpor    14 年前

    我想在这里确认马丁的解决方案。

    我的案例是在AIR平台上测试应用程序,运行良好,图像加载成功。

    我用马丁的建议。如果你跟踪一个url重定向,你会发现实际的图像配置文件位于CDN服务器上,而不是facebook本身,所以你需要根据actionscript的安全沙盒加载该域的策略文件。

    再次感谢。

        5
  •  0
  •   Jai    14 年前

    完全是猜测,但您可以使用URLLoader从重定向调用中获取数据,然后将其一起解析为一个图片xD

        6
  •  0
  •   Rahul    13 年前

    Security.loadPolicyFile('http://profile.ak.fbcdn.net/crossdomain.xml');
    Security.loadPolicyFile('http://profile.cc.fbcdn.net/crossdomain.xml');
    

    @Stiggler建议的URLLoader解决方案可能可以工作。我没试过。但与使用加载程序对象相比,它似乎更重。

        7
  •  0
  •   Arno van Oordt    12 年前

    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/