我正在尝试从我的cloudfront发行版加载图片。我的加载代码如下:
var thumbLoader:Loader = new Loader();
// add event listener to the thumbLoader
thumbLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, function (event:Event):void {
if (_thumbnail.bitmapData) _thumbnail.bitmapData.dispose();
_thumbnail.bitmapData = (thumbLoader.content as Bitmap).bitmapData;
_thumbnail.width = stage.stageWidth;
_thumbnail.height = stage.stageHeight;
thumbLoader.unload();
});
thumbLoader.load(new URLRequest(src)); // src = https://xxxxxxxxxxxxx.cloudfront.net/big_icon.png
我尝试过添加' LoaderContext'作为' .load'的第二个参数。打电话,但后来我只是弹出错误#2123而不是错误#2122。我还尝试将crossdomain.xml添加到我的swf托管服务器的根目录,但这没有做任何事情(无论如何,我对此感到困惑,如果crossdomain.xml进入云端?不是我的swf服务器吗?已经做过cloudfront有这个?)。
更新
我提出了一个适用于我当前项目的解决方案,但我并没有真正考虑问题的完整答案。仍然想知道如何设置cloudfront和as3所以我可以搞乱从那里加载的位图。
当我通过访问Bitmap
直接访问thumbLoader.content
数据时,会引发错误。如果你不访问.content
属性,你仍然可以显示没有安全错误的位图,所以我只是将加载器直接附加到舞台而不是将位图数据从加载器传送到Bitmap
实例:
stage.addChild(_thumbnail); // _thumbnail is now a Loader instance, not Bitmap
_thumbnail.contentLoaderInfo.addEventListener(Event.COMPLETE, function (event:Event):void {
_thumbnail.width = stage.stageWidth;
_thumbnail.height = stage.stageHeight;
});
_thumbnail.load(new URLRequest(src));
更新2:
我发现我甚至无法直接加载https://xxxxxxxxxxxx.cloudfront.net/crossdomain.xml。我收到一个流错误,这似乎表明该文件不存在。关于此主题的cloudfront文档非常稀疏,称有一个无法编辑的rtmp发行版的默认crossdomain.xml,并且根本没有提到用于Web发行版的crossdomain.xml。如何将此文件添加或编辑到Web分发?
答案 0 :(得分:0)
Gahhh,答案很简单,只需将crossdomain.xml上传到我的cloudfront发行版所指向的s3存储桶的根目录即可。我显然是一个很好的人。因此,无论您的cloudfront发行版中的起源选项卡指向何处,请转到该域并上传包含以下内容的crossdomain.xml文件:
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE cross-domain-policy SYSTEM
"http://www.adobe.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
<site-control permitted-cross-domain-policies="master-only" />
<allow-access-from domain="*" />
</cross-domain-policy>
您还需要提供一个LoaderContext
,其中第一个构造函数参数设置为true
,作为Loader.load调用的第二个参数,如下所示:
loader.load(new URLRequest(src), new LoaderContext(true));
这将告诉as3查找刚刚加载的crossdomain.xml并通过第一个安全错误(#2122)获取。如果您的crossdomain.xml位于正确的位置(root)并且提供了正确的权限(我只允许所有域访问'*'),第二个错误(#2123)将会消失