URLRequest или Loader просто не работают на некоторых компьютерах? - PullRequest
0 голосов
/ 24 августа 2010

Так что моя проблема может быть немного больше, но я не уверен.Я создаю специальный просмотрщик фотографий для клиента, который динамически загружает изображения с помощью объектов Loader.Он берет имя папки в указанном каталоге на сервере и вызывает страницу php (используя URLRequest), чтобы получить работоспособное содержимое папки.И затем он загружает его из этого массива.

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

Я добавил диагностику (пользовательский класс, который я сделал для отслеживания определенных переменных и сбора ошибок), чтобы обнаруживать любые ошибки, но он ничего не сообщаетна машине моего клиента.Я добавил код проверки флэш-версии, так что вероятность того, что более низкая версия испортит его, исчезла ...

Наверное, мой вопрос: есть ли что-нибудь (безопасность, окружение и т. Д.), Которое я мог бы иметьупущено из виду, что не позволяет объектам запроса или что-то работать на определенных машинах ??Я рвал на себе волосы, пытаясь понять это!

Мой код (соответствующие разделы):

    public static const LOADLIMIT:int = 4;

    public var paramObj:Object;
    private var imageRequests:Vector.<URLRequest>;
    private var loaderObj:Vector.<Loader>;
    private var nextToLoad:int = -1;

    //...

    public function Player(){
        //...
        paramObj = loaderInfo.parameters;
            if (!paramObj.root) paramObj.root = "http://site.com/images/";
            paramObj.imgloc = paramObj.imgloc;
            var res = bootstrapImages(paramObj.imgloc);
            if (res is String){
                loadErrorMsg.text = res;
                loadErrorMsg.visible = true;
                log.log(res);
            }
        //...
    }

    private function bootstrapImages(imgloc:String):*{
        try{
        if (!imgloc) return "No image location specified"; 

        var req:URLRequest = new URLRequest(paramObj.root+"getdirlist.php?name="+imgloc);
        var loader:URLLoader = new URLLoader();
        loader.addEventListener(Event.COMPLETE, directoryLoaded);
        loader.addEventListener(IOErrorEvent.IO_ERROR, function(ex:IOError){
            loadErrorMsg.text = "Error retreiving album data.";
            loadErrorMsg.visible = true;
            log.log(ex);
        });
        loader.load(req);
        } catch (ex:Error){
            log.log(ex); throw ex;
        }
    }

    private function directoryLoaded(e:Event){
        try{
        //directory will come down as a json array
        trace(e.target.data);
        try {
            var items:Array = JSON.decode(e.target.data);
        } catch (ex:Error){
            trace (ex.getStackTrace());
            loadErrorMsg.text = "Error parsing album data.";
            loadErrorMsg.visible = true;
            log.log(ex);
            return;
        } 

        if (items.length == 0){
            loadErrorMsg.text = "Invalid album name";
            loadErrorMsg.visible = true;
            log.log("Items length is 0.");
            return;
        }

        imageRequests = new Vector.<URLRequest>();
        loaderObj = new Vector.<Loader>();
        for each(var item:String in items){
            imageRequests.push(new URLRequest(paramObj.root+"coffeeimages/"+paramObj.imgloc+"/"+item));
            loaderObj.push(null);
        }

        //...show UI...

        for (var i:int = 0; i < LOADLIMIT; i++){
            imageLoaded(null);
        }
        } catch (ex:Error){
            log.log(ex); throw ex;
        }
    }

    private function imageLoaded(e:Event){
        try{
        //if this was called as a result of the load event, start the slideshow! :D
        if (e != null && e.target != null) {
            //stage.addChild((e.target as LoaderInfo).loader);
            trace(loaderObj[0]);
            if (loaderObj[0] != null && //if the first image is loaded
                loaderObj[0].contentLoaderInfo.bytesLoaded >= loaderObj[0].contentLoaderInfo.bytesTotal){ 
                trace(loaderObj[0].contentLoaderInfo.bytesLoaded, loaderObj[0].contentLoaderInfo.bytesTotal);
                loadErrorMsg.visible = false;
                playSlideshow(true);
            }
        }
        trace((e)?e.target:null, loaderObj);
        nextToLoad++;
        if (nextToLoad >= imageRequests.length) return;

        var r:URLRequest = imageRequests[nextToLoad];
        var l:Loader = new Loader();
        l.contentLoaderInfo.addEventListener(Event.COMPLETE, imageLoaded);
        l.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, function(ex:ErrorEvent){
            loadErrorMsg.text = "Error parsing image data.";
            loadErrorMsg.visible = true;
            log.log(ex);
        });
        l.load(r);
        loaderObj[nextToLoad] = l;
        log.addObjectWatch(l);
        } catch (ex:Error){
            log.log(ex); throw ex;
        }
    }

Кроме того, вот игрок в прямом эфире на сайте .Ctrl + Alt + Home вызывает мою панель диагностики.Пожалуйста, скажите мне, если это не работает для вас, так что я могу больше беспокоиться об этом ...: / Спасибо.

Редактировать: Я добавил больше отладочной информации.Оказывается, что на компьютерах, которые не могут его загрузить, они возвращают HTTP-статус 0, возвращаемый при попытке загрузить информацию об альбоме.Я понятия не имею, что это значит ...

Ответы [ 3 ]

1 голос
/ 07 сентября 2010

Итак, проблема заключалась в том, что URL запрашивал ...

Мой клиент набирал «www.site.com», а мой код запрашивал «site.com». Для Adobe это межсайтовый запрос, и НЕ РАЗРЕШЕНО по умолчанию. Одним из решений (и, возможно, самым простым) является добавление файла с именем «crossdomain.xml» в корневую папку веб-сайта. Flash ищет этот файл при выполнении запроса. Один пример, который работал для меня, выглядит следующим образом:

//crossdomain.xml
<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd">

<cross-domain-policy>
    <allow-access-from domain="*.site.com" secure="false"/>
</cross-domain-policy>

Другие решения включают перенаправление на одно из двух («site.com» перенаправляет на «www.site.com»), или перезапись URL-адреса, или получение URL-адреса, который они ввели.

0 голосов
/ 10 сентября 2012

Мне нравится решение crossdomain.xml, упомянутое выше, но у нас была похожая проблема на наших клиентских ПК. Проблема заключалась в том, что плагины браузера adblocker блокировали URLRequest действия. В настоящее время мы находим решение этой проблемы.

0 голосов
/ 24 августа 2010

Несколько вещей, которые я заметил, вы слушаете только Event.COMPLETE и IOErrorEvent.IO_ERROR. Я бы посоветовал также прослушать HTTPStatusEvent.HTTP_STATUS, Event.OPEN, хотя я не добавил их, они могут предоставить полезную информацию, если вы до сих пор никуда не попали.

Вам не нужен объект LoaderContext, если вы только загружаете изображения и не обращаетесь к их содержимому, так что (безопасность) действительно не должна быть проблемой. Вам определенно следует отделить свою логику в imageLoaded, чтобы она не была ни инициатором, ни обработчиком завершения для ваших загрузчиков.

В любом случае, не знаю, будет ли это полезно для вас, но я сделал ваш код значительно более читабельным и переработал некоторые вещи, которые не имели никакого смысла.

public static const LOADLIMIT:int = 4;

private var paramObj:Object;
private var imageRequests:Vector.<URLRequest>;
private var loaderObj:Vector.<Loader>;
private var nextToLoad:int = -1;

public function Player(){
    paramObj = loaderInfo.parameters;

    //what is this all about, your backup URL is useless?
    if (!paramObj.root) {
        paramObj.root = "http://site.com/images/";
    }

    var res = bootstrapImages();
    if (res.length > 0){
        loadErrorMsg.text = res;
        loadErrorMsg.visible = true;
        //log.log kills me
        log.log(res);
    }
}

private function bootstrapImages():String {
    try {
        var req:URLRequest = new URLRequest(paramObj.root + "getdirlist.php?name=" + paramObj.imgloc);
        var loader:URLLoader = new URLLoader();
        loader.addEventListener(Event.COMPLETE, directoryLoaded);
        loader.addEventListener(IOErrorEvent.IO_ERROR, dataIOError);
        loader.load(req);
    } catch (ex:Error) {
        log.log(ex);
    }
    return "";
}

private function directoryLoaded(e:Event):void{
    trace(e.target.data);
    try {
        var items:Array = JSON.decode(e.target.data);
    } catch (ex:Error){
        trace (ex.getStackTrace());
        loadErrorMsg.text = "Error parsing album data.";
        loadErrorMsg.visible = true;
        log.log(ex);
        return;
    } 

    if (items.length == 0){
        loadErrorMsg.text = "Invalid album name";
        loadErrorMsg.visible = true;
        log.log("Items length is 0.");
        return;
    }

    imageRequests = new Vector.<URLRequest>();
    loaderObj = new Vector.<Loader>();
    for each(var item:String in items){
        imageRequests.push(new URLRequest(paramObj.root+"coffeeimages/"+paramObj.imgloc+"/"+item));
        loaderObj.push(new Loader());
    }

    for (var i:int = 0; i < LOADLIMIT; i++){
        loadNextImage();
    }
}

private function loadNextImage():void {
    nextToLoad++;
    if (nextToLoad < imageRequests.length) {
        loaderObj[nextToLoad].contentLoaderInfo.addEventListener(Event.COMPLETE, imageLoaded);
        loaderObj[nextToLoad].contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, dataIOError);
        try {
            loaderObj[nextToLoad].load(imageRequests[nextToLoad]);
        }
        catch (e:Error) {
            log.log(ex);
        }
        log.addObjectWatch(loaderObj[nextToLoad]);
    }
}

private function dataIOError(e:IOError):void {
    loadErrorMsg.text = "IOError: " + e.errorID + " - " + e.name + ", " + e.message;
    loadErrorMsg.visible = true;
    log.log(ex);
}

private function imageLoaded(e:Event){
    //Start the slideshow if the first image has loaded
    loadNextImage();
    if (e.target == loaderObj[0]) {
        trace(loaderObj[0].contentLoaderInfo.bytesLoaded, loaderObj[0].contentLoaderInfo.bytesTotal);
        loadErrorMsg.visible = false;
        playSlideshow(true);
    }
}

Редактировать: Вы можете просто полностью отказаться от кода загрузки и вместо этого использовать Bulk Loader

...