Ошибка безопасности #2122 загрузка образа из Amazon Cloudfront
Я пытаюсь загрузить изображение из своего дистрибутива 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. Я также попытался добавить кросс-домен.xml в корень сервера, на котором размещен мой swf, но это ничего не делает (я был смущен этим в любом случае, если кросс-домен.xml идет на cloudfront? не мой 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 очень скудна по этому вопросу, говоря, что существует кросс-домен по умолчанию.xml для дистрибутивов rtmp, которые нельзя редактировать, и не упомянуть междоменные.xml вообще для веб-дистрибутивов. Как добавить или отредактировать этот файл в веб-дистрибутив?
1 ответ:
Гах, ответ был так же прост, как загрузка кроссдомена.xml к корню корзины s3, на которую указывал мой дистрибутив cloudfront. Я, очевидно, aws n00b. Поэтому, куда бы ни указывала вкладка origins в вашем дистрибутиве cloudfront, перейдите в этот домен и загрузите кросс-домен.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(new URLRequest(src), new LoaderContext(true));
Это скажет as3 искать этот кроссдомен.xml вы просто загрузили и получите вас по первой ошибке безопасности (#2122). Вторая ошибка (#2123) исчезнет, если ваш кроссдомен.xml находится в правильном месте (root) и дает правильные разрешения (я просто разрешил доступ ко всем доменам с помощью'*')