Domanda

Quindi il mio problema potrebbe essere un po 'più grande di quello, ma non ne sono certo. Sto creando un visualizzatore di foto con il flash su misura per un cliente che carica dinamicamente le immagini con oggetti Loader. Ci vuole un nome di cartella in una directory specificata sul server e richiama una pagina PHP (usando URLRequest) per ottenere il contenuto lavorabili della cartella. E poi lo carica su da tale matrice.

Ecco il problema: funziona bene sulla mia macchina e ogni macchina che ho provato, ma non funziona sulla macchina del mio cliente o di alcune delle macchine del suo cliente. Il caricatore di barre che è alla parte inferiore dello schermo non inizia a riempirsi, il che significa che le immagini non stanno iniziando a carico anche, e la barra di stato indica che continua ad attendere per un server, ma non finisce mai di attesa. Ciò è coerente su una singola macchina, ma varia tra i computer.

Ho diagnostica aggiunto (una classe personalizzata che ho fatto per monitorare alcuni Vars ed errori Colletta) alla cosa per catturare eventuali errori, ma riporta nulla sulla macchina del mio cliente. Ho aggiunto Flash codice di controllo della versione, quindi la possibilità di una versione inferiore scompigliare in su è andato ...

Credo che la mia domanda è, c'è qualcosa (sicurezza, ambiente, ecc) che avrei potuto trascurato che non permette di oggetti di richiesta o qualcosa su cui lavorare alcune macchine ?? Sto strappando i miei capelli cercando di capire questo fuori!

Il mio codice (sezioni):

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

Inoltre, ecco il lettore in diretta sul sito . Ctrl + Alt + Home porta in primo piano il mio pannello di diagnostica. Ti prego, dimmi se non funziona per voi pure, in modo da poter essere più preoccupato per questo ...: / Grazie

.

Modifica Ho aggiunto ulteriori informazioni di debug. Scopre che sui computer che non può caricare, stanno ottenendo uno stato HTTP 0 restituito quando si cerca di bootstrap le informazioni sull'album. Non ho idea di che cosa ciò significhi ...

È stato utile?

Soluzione

Quindi, il problema era una questione di dell'URL sua richiesta ...

Il mio cliente era digitando "www.site.com", mentre il mio codice è stato chiedendo di "site.com". Per Adobe, questa è una richiesta sito croce, e NON AMMESSI per impostazione predefinita. Una soluzione (e probabilmente il più semplice) è quello di aggiungere un file chiamato "crossdomain.xml" nella cartella principale del sito. Flash cerca questo file quando si effettua una richiesta. Un esempio che ha lavorato per me è la seguente:

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

Altre soluzioni coinvolgono reindirizzamento a uno dei due (redirect "site.com" a "www.site.com"), o fare la riscrittura degli URL, o di ottenere URL che sono entrati.

Altri suggerimenti

Un paio di cose che ho notato, si sta solo ascoltando per Event.COMPLETE e IOErrorEvent.IO_ERROR. Io suggerirei anche di ascolto per HTTPStatusEvent.HTTP_STATUS, Event.OPEN, anche se non ho aggiunto quelli, possono fornire informazioni utili se ancora non si è trovato da nessuna parte.

Non dovrebbe essere necessario un oggetto LoaderContext se si sta caricando solo le immagini e non accedere al contenuto, in modo che (la sicurezza) in realtà non dovrebbe essere un problema. Si dovrebbe separare la logica in imageLoaded in modo che non sia l'iniziatore e il gestore di completamento per le Pale.

In ogni caso, nessun indizio se questo sarà utile a voi, ma ho fatto il codice sostanzialmente più leggibile e rielaborato alcune cose che ha fatto poco senso.

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

Modifica Si può semplicemente voler scartare il codice di caricamento del tutto e di utilizzare invece Bulk Loader

Mi piace la soluzione crossdomain.xml di cui sopra, ma abbiamo avuto un problema simile sul nostro PC del cliente. Il problema era che adblocker plugin del browser bloccavano l'URLRequest del ActionScript. Attualmente stiamo trovando una soluzione a questo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top