Pregunta

Así que mi problema puede ser un poco más grande que eso, pero no estoy seguro. Estoy creando un visor de fotos flash de encargo para un cliente que carga dinámicamente las imágenes con objetos Loader. Se necesita un nombre de carpeta en un directorio especificado en el servidor y llama a una página php (usando URLRequest) para obtener el contenido de la carpeta viables. Y luego lo carga a partir de la matriz.

Aquí está el problema: funciona bien en mi máquina y cada máquina que he probado, pero no funciona en la máquina de mi cliente o algunas de las máquinas de su cliente. La barra del cargador que está en la parte inferior de la pantalla no se inicia al relleno, lo que significa que las imágenes no están empezando a carga uniforme, y la barra de estado indica que se sigue esperando un servidor, sin embargo, nunca termina de espera. Esto es coherente en una sola máquina, sino que varía a través de las máquinas.

He añadido diagnóstico (una clase personalizada que hice para rastrear ciertas VARs y errores por cobrar) a lo que hay que detectar cualquier error, pero se informa nada en la máquina de mi cliente. He añadido flash de código de comprobación de versión, por lo que la posibilidad de una versión inferior mezclarlo se ha ido ...

Creo que mi pregunta es, ¿hay algo (seguridad, medio ambiente, etc.) que podría haber pasado por alto que no permite objetos de solicitud o algo para trabajar en ciertas máquinas ?? He estado rasgando mi pelo a cabo tratando de resolver esto!

Mi código (secciones pertinentes):

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

Además, aquí está el jugador vivo en el sitio . Ctrl + Alt + Inicio trae a mi panel de diagnóstico. Por favor, dígame si no lo hace el trabajo para usted también, así que puede ser más preocupado por esto ...: / Gracias

.

Editar He añadido más información de depuración. Resulta que en los equipos que no se pueden cargar, que están recibiendo un estado HTTP devuelto 0 al intentar arrancar la información del álbum. No tengo idea de lo que eso significa ...

¿Fue útil?

Solución

Por lo tanto, el problema era una cuestión de la URL que solicita su ...

Mi cliente estaba escribiendo "www.site.com", mientras que el código estaba solicitando a "site.com". Para Adobe, esto es una petición en sitios cruzados, y NO PERMITIDA de forma predeterminada. Una solución (y probablemente el más fácil) es añadir un archivo llamado "crossdomain.xml" a la carpeta raíz del sitio web. Flash busque este archivo al hacer una solicitud. Un ejemplo que trabajó para mí es el siguiente:

//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>

Otras soluciones implican volver a dirigir a uno de los dos (redirecciones "site.com" a "www.site.com"), o haciendo la reescritura de URL, o conseguir url que entraron.

Otros consejos

Un par de cosas que me di cuenta, sólo se está escuchando para Event.COMPLETE y IOErrorEvent.IO_ERROR. Me gustaría sugerir también la escucha de HTTPStatusEvent.HTTP_STATUS, Event.OPEN, aunque no he añadido los de, pueden proporcionar información útil si todavía no está recibiendo ninguna parte.

No debería ser necesario un objeto LoaderContext si sólo se está cargando imágenes y no acceder a su contenido, de manera que (seguridad) en realidad no debería ser un problema. Definitivamente, usted debe separar la lógica de imageLoaded por lo que no es tanto el iniciador y el manejador de terminación para sus cargadores.

De todos modos, ni idea de si esto va a ser de utilidad para usted, pero he hecho sustancialmente su código más legible y reelaborado algunas cosas que hacían poco sentido.

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

Editar Es posible que simplemente desean para el desguace de su código de carga por completo y en su lugar utilizar granel cargador

Me gusta la solución /crossdomain.xml mencionado anteriormente, pero tuvimos un problema similar en nuestros PC del cliente. El problema era que AdBlocker plugins del navegador estaban bloqueando la URLRequest del actionscript. Actualmente estamos encontrando una solución a esto.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top