2010-08-24 1 views
0

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

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

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

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

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

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; 
     } 
    } 

Кроме того, here's the player live on the site. Ctrl + Alt + Home вызывает панель диагностики. Скажите, пожалуйста, если это не сработает для вас, поэтому я могу больше беспокоиться об этом ...:/Спасибо.

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

+0

Изображения загружаются для меня, FF4 Beta, Flash Player 10.1. И Chrome 5 и Safari 5, и IE8. – Aaron

+0

Работает для меня, а также FF 3.6.8 и IE 8 (хотя по некоторым причинам много медленнее FF) – Tommy

+0

Работает для меня OSX Snow Leopard, Chrome 6.0.472.41 beta, FF 3.6.6, Opera 10.53, Safari 5.0.1 , Flash Player 10.1 версия отладки – PatrickS

ответ

1

Таким образом, проблема была делом в 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, или получить которые они ввели.

0

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

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

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

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); 
    } 
} 

Edit: Вы можете просто хотите отказаться от кода загрузки целиком и вместо того, чтобы использовать Bulk Loader

+0

Извините, изменен резервный URL-адрес оригинала, несмотря на то, что я предоставляю ссылку на сайт в своем сообщении. Резервный URL-адрес является фактическим URL-адресом в фактическом коде. Кроме того, переменная журнала является моим настраиваемым объектом диагностики. : P – Tustin2121

+0

Это тоже хорошо: paramObj.imgloc = paramObj.imgloc; Я просто удалил его, хе-хе. В моем ответе была определенная переделка вашей логики, хотя я не могу сказать, что она обязательно исправит вашу проблему, она согласованно разделяет логику загрузки и завершения. Я видел, как чрезмерно агрессивный сборщик мусора вызывает такие странные проблемы, как вы описали ... Мне также было любопытно, как вы нажимаете нули в loaderObj Vector, поэтому я изменил это поведение. – Aaron

+0

Ах, я даже не догадывался, что у меня это есть. Это было с того момента, когда в конце этого назначения было значение по умолчанию, пока я не решил использовать значение по умолчанию. Я попробую это сегодня вечером, чтобы посмотреть, не изменит ли это что-нибудь. Благодарю. :) – Tustin2121

0

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