Ошибка безопасности #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 2

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) и дает правильные разрешения (я просто разрешил доступ ко всем доменам с помощью'*')