Domanda

Sto cercando un modo semplice per trovare le dimensioni dei file che sto pianificando di caricare senza caricarli ancora. Fondamentalmente sto creando un batch di file che deve essere caricato e sarebbe molto utile se potessi determinare in anticipo quanto sarà grande il carico totale.

l'oggetto Loader in flash ha una proprietà totalBytes, ma ciò restituirà un valore solo quando si sta già caricando un file.

È stato utile?

Soluzione

Per carico, intendi tutto caricato o senza chiamata di caricamento? Se una chiamata di caricamento è accettabile, potrebbe essere utile quanto segue. L'evento progress fornisce la dimensione totale dei dati in arrivo al primo fuoco. Semplicemente lasciamo che un determinato evento progress si attivi, prendiamo il valore totale dell'elemento di caricamento corrente e lo aggiungiamo alla nostra variabile _total; Continuiamo fino a quando il nostro dataprovider (array, xml, ecc.) È vuoto. alla fine hai la somma di tutti i tuoi beni totali.

package
{
    import flash.display.Sprite;
    import flash.display.Loader;
    import flash.events.Event;
    import flash.events.ProgressEvent;
    import flash.URLLoader;
    import flash.URLRequest;

    public class ExampleDocumentClass extends Sprite
    {
        private var _urlLoader:URLLoader;
        private var _loader:Loader;
        private var _request:URLRequest;
        private var _total:Number;
        private var _array:Array;

        public function ExampleDocumentClass():void
        {
            if(stage) _init;
            else addEventListener(Event.ADDED_TO_STAGE, _init);
        }
        private function _init(e:Event = null):void
        {
            _array = [{type:"nonDisplay", path:"path/to/file"},{type:"display", path:"path/to/file"}];
            _urlRequest = new URLRequest();

            //Non display asset
             _urlLoader = new URLLoader();
            _urlLoader.addEventListener(ProgressEvent.PROGRESS, _onProgress);

            //Display asset
            _loader = new Loader();

            loadAsset();
        }
        private function loadAsset():void
        {
            if(_array.length > 0)
            {
                var pObj:Object = _array[0];
                if(pObj.type == "nonDisplay")
                {
                    loadNonDisplayAsset(pObj.path);
                }
                else
                {
                    loadDisplayAsset(pObj.path);
                }
                //Remove this item from the array;
                _array.shift();
            }
        }
        private function loadNonDisplayAsset(pAsset:String):void
        {
            _urlRequest.url = pAsset;
            _urlLoader.load(_urlRequest);
        }
        private function loadDisplayAsset(pAsset:String):void
        {
            _urlRequest.url = pAsset;
            _loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, _onProgress);
            _loader.load(_urlRequest);
        }
        private function _onProgress(e:ProgressEvent):void
        {
            _total += e.bytesTotal;
            _loader.contentLoaderInfo.removeEventListener(ProgressEvent.PROGRESS, _onProgress);
            _urlLoader.removeEventListener(ProgressEvent.PROGRESS, _onProgress);
        }
    }
}

Quindi carichiamo un asset abbastanza a lungo da aggiungere il suo totale Dimensione, alla nostra variabile _total e quindi chiamiamo l'elemento successivo nella matrice e aggiungiamo il suo totale fino a quando il fornitore di dati è vuoto. Ovviamente questo potrebbe essere fatto con XML, o comunque tu voglia, un array è proprio quello che ho usato per l'esercizio.

Altri suggerimenti

Non è possibile ottenere prima le dimensioni di un file da Actionscript 3 . Una soluzione semplice sarebbe quella di aggiungere un piccolo script al server che scansiona tutti i file e restituisce i loro nomi e le loro dimensioni allo swf (come JSON o XML o altro) .

Non è possibile farlo in ActionScript. Per fare ciò avrai bisogno di un codice lato server. È possibile creare un metodo che accetta un nome file e restituisce i byte totali.

Non so come faresti con ActionScript (non sono un Guru) ma la mia prima ipotesi sarebbe quella di utilizzare uno script PHP (o qualsiasi altro linguaggio di scripting di tua scelta) per ottenere le dimensioni del file e restituire i valori.

Un altro modo (probabilmente eccessivo) sarebbe quello di creare qualcosa che richieda semplicemente al server le intestazioni del file (inclusa la dimensione del file). Lo stesso potrebbe essere ottenuto semplicemente iniziando a scaricare il file e chiudendo il flusso quando si ha la dimensione del file (dovrebbe essere piuttosto veloce) o avendo (come suggerito prima) un altro modo di chiedere al server la dimensione del file (utile se stai caricando più file e devi conoscere la dimensione del file prima di caricarlo)

Ho sperimentato il metodo fornito da Brian Hodge, nonché un altro metodo in cui ho inviato variabili (posizioni delle cartelle come stringhe da XML) a PHP per ottenere la dimensione combinata di tutti i file all'interno di una determinata cartella e restituire i dati su Flash.

Uno dei maggiori problemi che ho riscontrato nel mio viaggio nel paradiso del precaricamento è stato che Flash Player sembra produrre risultati incoerenti per quanto riguarda le dimensioni del file! Anche se avessi caricato esattamente gli stessi file due volte, Flash mi avrebbe detto che avevano dimensioni diverse ... a volte.

Ciò ha anche causato problemi con il metodo alternativo (PHP), dal momento che lo script PHP avrebbe prodotto risultati (apparentemente) di dimensioni dei file accurati che erano incoerenti con quelli prodotti da Flash, facendo sì che il mio caricatore passasse all'85% o al 128%, sulla cache e l'umore di Flash: /

Ho eliminato entrambi i metodi a favore di una bella classe chiamata bulk-loader , che consente il caricamento in coda e il monitoraggio dell'avanzamento di più elementi e molto altro: D

Tieni presente che aumenterà in modo significativo la dimensione del tuo file swf ... che ironia

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