Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Как убрать SecurityError: Error #2122: (http://www.flasher.ru/forum/showthread.php?t=154807)

Universe 22.04.2011 18:56

Как убрать SecurityError: Error #2122:
 
Пытаюсь загрузить картинку которая находится на другом сайте (на facebook'e) в своё приложение и получаю ошибку
Код:

SecurityError: Error #2122: Нарушение изолированной среды: getChildAt: http://ffly.com.ua/rosco/wishlist/ma...time())%20?%3E не может осуществить доступ к http://profile.ak.fbcdn.net/hprofile...jpg?type=large. Необходим файл политики, но, когда были загружены эти мультимедийные данные, флаг checkPolicyFile не был установлен.
        at flash.display::DisplayObjectContainer/getChildAt()
        at com.main::UserPhoto/imageLoaded()

мне посоветовали закинуть на свой сервер в папку www/имя сайта/ файл crossdomain.xml, со следующим содержанием:
Код:

<?xml version="1.0"?>
    <cross-domain-policy>
    <allow-access-from domain="*" to-ports="80"/>
</cross-domain-policy>

Но это не помогло.
Затем я попробовал создать экземпляр класса LoaderContext и изменил стрку загрузки следующим образом
Код AS3:

imgLoader.load(new URLRequest(userPath), context);

Но это также не помогло. Сам путь приходит в флеш, но затем выпадает ошибка!
Вот весь код класса который я использую на данный момент:
Код AS3:

package com.main
{
        import flash.display.*;
        import flash.events.*;
        import flash.utils.*;
        import flash.net.*;
        import flash.text.*;
        import flash.system.LoaderContext;
 
        public class UserPhoto extends MovieClip
        {
                private var userPath:String;
                private var imgLoader:Loader;
                private var context:LoaderContext;
 
                public function UserPhoto(userPath:String)
                {
                        this.userPath = userPath;
                        if (stage) init();
                        else addEventListener(Event.ADDED_TO_STAGE, init);
                }
 
                private function init(e:Event=null):void
                {
                        trace("UserPhoto Created");
                        result_txt.text = userPath;
                        loadImage();
 
                }
 
                private function loadImage():void
                {
                        imgLoader = new Loader();
                        context = new LoaderContext(true);
                        context.checkPolicyFile = true;
                        imgLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, imageLoaded);
                        imgLoader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, imageLoading);
                        imgLoader.load(new URLRequest(userPath), context);
                }
 
                private function imageLoading(e:ProgressEvent):void
                {
                        preloader.scaleX = e.bytesLoaded/e.bytesTotal;
                }
 
                private function imageLoaded(e:Event):void
                {
                        //trace(imgLoader.getChildAt(0));
                        changeImage(imgLoader.getChildAt(0));
                        preloader.visible = false;
                }
 
                private function changeImage(img):void
                {
                        //trace("IMG " + img.width);
                        //img.smoothing = true;
                        img.x = mask_mc.x;
                        img.y = mask_mc.y;
                        addChild(img);
                        //img.mask = mask_mc;
                        //setChildIndex(img, numChildren-1);
                        //getChildAt(0).visible = false;
                        result_txt.text = userPath + "LOADED";
                        trace("Some actions with the image!");
                }
 
        }
}


udaaff 22.04.2011 18:59

Передавайте сам лоадер в changeImage().

cleptoman 23.04.2011 09:07

юзайте байты загруженного изображения
http://www.flasher.ru/forum/blog.php?b=323

iNils 23.04.2011 12:26

Цитата:

Затем я попробовал создать экземпляр класса LoaderContext и изменил стрку загрузки следующим образом
Просто сделали new LoaderContext () или с флагом new LoaderContext (true) ?

fish_r 23.04.2011 12:41

Это не на вашем сайте должен быть crossdomain, а там откуда вы получаете картинку (с facebook-а?).
Там есть API, только я незнаю его возможностей. Если не получится загружать "по правилам" исправьте:

Код AS3:

...
 
context = new LoaderContext(true);
 
...
imgLoader.load(new URLRequest(userPath), context);

и дальше сделайте либо как советует @cleptoman, либо как @udaaff

DZHETIGAPA 24.04.2011 14:12

Мне помогло вот это

http://www.flasher.ru/forum/showthread.php?p=800092

breket 07.01.2013 19:51

Есть решение намного проще
В любом месте программы (желательно в начале работы) пишем
Код AS3:

Security.loadPolicyFile("https://fbcdn-profile-a.akamaihd.net/crossdomain.xml");

далее в загрузчике делаем вот такие изменения
Код AS3:

loader.load(new URLRequest("http://some.site/some_image.jpg"),new LoaderContext(true,ApplicationDomain.currentDomain,SecurityDomain.currentDomain));

и всё замечательно работает! Как вариант этот удалённый crossdomain.xml можно скопировать на свой хостинг в корень и загружать его.
Проверено на практике для приложения Вконтакте


Часовой пояс GMT +4, время: 04:06.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.