Pregunta

Muy bien, actualmente tengo mi SWF accediendo a un archivo php que buscará todos los archivos que le especifique, sumará sus tamaños y devolverá sus tamaños combinados como un solo número.Luego uso este número con un oyente ProgressEvent para determinar el porcentaje actual de descarga de archivos para esa sección particular del sitio web.

Bastante sencillo ¿verdad?Bueno, ahora usar ese archivo PHP está fuera de discusión y estoy intentando hacer todo dentro del SWF en lugar de tener que acceder a un script externo para obtener los números que necesito.

¿Existe alguna buena manera de obtener el tamaño de un archivo ANTES de comenzar a cargarlo en flash?Realmente necesito que el precargador sea de 0 a 100%, por lo que necesito la cantidad total de bytes que descargaré antes de que realmente comience.

Un pensamiento que tuve fue simplemente revisar la matriz que contiene las URL de los archivos, comenzar a cargarlas, obtenerTotalBytes sin mostrar ninguna carga, finalizar la carga en el primer tick, sumar todos esos números totales de bytes y luego comenzar el proceso de descarga real.Este método parece muy feo y será una gran pérdida de tiempo, ya que cada vez que el usuario accede a un precargador en el sitio, probablemente tardará uno o dos segundos en revisar todos los archivos, encontrar el total y luego comenzar a descargarlos.

¿Existe una mejor solución a este problema sin salir del flash para obtener el tamaño de esos archivos?

¿Fue útil?

Solución

Puede realizar una solicitud HTTP HEAD al servidor para los archivos.Esto devolverá la información del encabezado (incluido el tamaño del archivo) pero no el archivo real.Luego podría realizar una solicitud GET para cargar los archivos.

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

(Consulta la sección 9.4 HEAD)

Lo que probablemente haría es una barra de progreso de dos niveles (con 2 barras de progreso).Uno que muestra el progreso general (0 a 100%) y otro que muestra el progreso por archivo (a medida que se descarga cada archivo).

De esa manera, siempre que sepa la cantidad de archivos que desea cargar, podrá realizar el progreso total sin tener que acceder primero al servidor para obtener los tamaños de los archivos.

cámaras de micrófono

malla@adobe.com

Otros consejos

La idea de Mike Chamber te ayudará, pero seguirá siendo más lenta que usar algo del lado del servidor, ya que tendrás que realizar una solicitud para cada archivo de todos modos.Es esencialmente lo mismo que usted mismo dice, pero cuando solicita explícitamente los encabezados, será un poco más rápido.Utilice un Socket para realizar la solicitud:

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

Si es absolutamente necesario controlar cómo se cargan los archivos, entonces creo que la sugerencia de Mike Chambers de realizar una solicitud HTTP HEAD es el camino a seguir.

Sin embargo, a menos que haya una buena razón para no hacerlo, simplemente comenzaría a cargar todos los archivos a la vez y obtendría los tamaños de mis archivos del método getBytesTotal de cada archivo.Dado que Flash obtiene su pila de red del navegador, la cantidad de archivos realmente cargados simultáneamente se ajustará a la configuración del navegador (definible por el usuario).

Lo siguiente es sólo a modo de ejemplo.En un caso real, no usaría el temporizador, tendría una matriz o un objeto XML para iterar con un bucle for, independientemente de que funcione muy bien y básicamente una vez que llegue al final del bucle (por ejemplo,if(i == (length - 1)) haga que llame a la funcionalidad que inicia la precarga real ahora que tenemos nuestro total.Ahora iteramos nuevamente a través de la matriz u objeto XML, pero esta vez lo hacemos solo una vez que se ha cargado cada activo, no en un bucle for.Este método asincrónico puede luego sentarse allí y comparar la cantidad de datos que ha cargado y dividirlos por el total encontrado anteriormente, lo que le brinda su porcentaje.

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();
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top