Domanda

Va bene, al momento il mio SWF colpisce un file php che andrà a trovare tutti i file che ho specificato, aggiungerà le loro dimensioni insieme e restituirà le loro dimensioni combinate come un unico numero.Quindi utilizzo questo numero con un ascoltatore ProgressEvent per determinare la percentuale corrente di download di file per quella particolare sezione del sito web.

Abbastanza semplice, vero?Bene, ora usare quel file PHP è fuori questione e sto tentando di fare tutto all'interno dell'SWF invece di farlo premere su uno script esterno per ottenere i numeri di cui ho bisogno.

Esiste un buon modo per ottenere la dimensione di un file PRIMA di iniziare a caricarlo in Flash?Ho davvero bisogno che il precaricatore sia un precaricatore dallo 0 al 100%, quindi ho bisogno del numero totale di byte che scaricherò prima che inizi effettivamente.

Un pensiero che ho avuto è stato semplicemente quello di scorrere l'array contenente gli URL dei file, iniziare a caricarli, ottenereTotalBytes senza visualizzare alcun caricamento, interrompere il caricamento al primo segno di spunta, sommare tutti i numeri di byte totali e quindi avviare il processo di download vero e proprio.Questo metodo sembra molto brutto e sarà un'enorme perdita di tempo poiché ogni volta che l'utente preme un preloader sul sito probabilmente ci vorranno un secondo o due per scorrere tutti i file, trovare il loro totale e quindi avviare effettivamente il download.

Esiste una soluzione migliore a questo problema senza uscire dal flash per ottenere la dimensione di tali file?

È stato utile?

Soluzione

Potresti fare una richiesta HTTP HEAD al server per i file.Ciò restituirà le informazioni sull'intestazione (inclusa la dimensione del file) ma non il file effettivo.Potresti quindi effettuare una richiesta GET per caricare i file.

http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html

(Consulta la sezione 9.4 TESTA)

Quello che probabilmente farei è una barra di avanzamento a due livelli (con 2 barre di avanzamento).Uno mostra l'avanzamento generale (da 0 a 100%) e uno mostra l'avanzamento per file (man mano che ciascun file viene scaricato).

In questo modo, finché conosci il numero di file da caricare, puoi eseguire l'avanzamento totale senza dover prima accedere al server per ottenere le dimensioni dei file.

camere del microfono

mesh@adobe.com

Altri suggerimenti

L'idea di Mike Chamber ti aiuterà ma sarà comunque più lenta rispetto all'utilizzo di qualcosa lato server, poiché dovrai comunque fare una richiesta per ciascun file.È essenzialmente lo stesso di quello che dici tu, ma quando chiedi esplicitamente le intestazioni sarà leggermente più veloce.Utilizza un Socket per eseguire la richiesta:

var socket : Socket = new Socket( );
socket.addEventListener( Event.CONNECT, connectHandler );
socket.addEventListener( ProgressEvent.SOCKET_DATA, dataHandler );
socket.connect( "yourserver.com", 80 );

function connectHandler( event : Event ) : void {
    var headers : String = "HEAD yourfilename.ext http/1.1\r\n";
    headers += "Host: yourserver.com\r\n";
    headers += "\r\n\r\n";
    socket.writeUTFBytes( headers );
    socket.flush( );
}

function dataHandler( event : ProgressEvent ) : void {
    trace( "Received headers\n" );
    trace( socket.readUTF( socket.bytesAvailable ) );
}

Se è assolutamente necessario controllare come vengono caricati i file, allora credo che il suggerimento di Mike Chambers di fare una richiesta HTTP HEAD sia la strada da percorrere.

Tuttavia, a meno che non ci sia una buona ragione per non farlo, inizierei semplicemente a caricare tutti i file contemporaneamente e otterrei le dimensioni dei file dal metodo getBytesTotal di ciascun file.Poiché Flash ottiene lo stack di rete dal browser, il numero di file effettivamente caricati contemporaneamente sarà conforme alle impostazioni del browser (definibili dall'utente).

Quanto segue è solo a scopo esemplificativo.In un caso reale non utilizzerei Timer, avrei un array o un oggetto XML da scorrere con un ciclo for, a prescindere funziona benissimo e fondamentalmente una volta raggiunta la fine del ciclo (ad es.if(i == (length - 1)) chiedi di chiamare la funzionalità che avvia il precaricamento effettivo ora che abbiamo il nostro totale.Ora iteriamo nuovamente attraverso l'array o l'oggetto XML, ma questa volta lo facciamo solo dopo che ogni risorsa è stata caricata, non in un ciclo for.Questo metodo asincrono può quindi sedersi lì e confrontare la quantità di dati caricati e dividerli per il totale trovato in precedenza fornendoti la percentuale.

var totalBytes:Number = 0;

var loader:Loader = new Loader();
var request:URLRequest = new URLRequest();
request.url = 'badfish.jpg';

var timer:Timer = new Timer(200);
timer.addEventListener(TimerEvent.TIMER, onTimer);

function onTimer(e:TimerEvent)
{
    loader.load(request);
    loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, onProgress);
}
function onProgress(e:ProgressEvent):void
{
    totalBytes+=e.bytesTotal;
    trace(e.bytesTotal,totalBytes);
    loader.contentLoaderInfo.removeEventListener(ProgressEvent.PROGRESS, onProgress);
}

timer.start();
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top