Pergunta

Tudo bem, atualmente tenho meu SWF acessando um arquivo php que irá encontrar todos os arquivos que eu especificar, adicionar seus tamanhos e retornar seus tamanhos combinados como um número.Em seguida, uso esse número com um ouvinte ProgressEvent para determinar a porcentagem atual de download de arquivos para aquela seção específica do site.

Muito simples, certo?Bem, agora usar esse arquivo PHP está fora de questão e estou tentando fazer tudo dentro do SWF em vez de acessar um script externo para obter os números que preciso.

Existe alguma boa maneira de obter o tamanho de um arquivo ANTES de começar a carregá-lo no flash?Eu realmente preciso que o pré-carregador seja um pré-carregador de 0 a 100%, então preciso do número total de bytes que irei baixar antes de realmente iniciar.

Um pensamento que tive foi apenas percorrer a matriz que contém os URLs dos arquivos, começar a carregá-los, obterTotalBytes sem exibir nenhum carregamento, interromper a carga no primeiro tick, somar todos os números totais de bytes e, em seguida, iniciar o processo de download real.Este método parece muito feio e será uma grande perda de tempo, pois toda vez que o usuário acessar um pré-carregador no site, provavelmente levará um ou dois segundos para percorrer todos os arquivos, encontrar o total e então iniciar o download.

Existe uma solução melhor para esse problema sem sair do flash para obter o tamanho desses arquivos?

Foi útil?

Solução

Você poderia fazer uma solicitação HTTP HEAD ao servidor para obter os arquivos.Isso retornará as informações do cabeçalho (incluindo o tamanho do arquivo), mas não o arquivo real.Você poderia então fazer uma solicitação GET para carregar os arquivos.

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

(Confira a seção 9.4 CABEÇA)

O que eu provavelmente faria seria uma barra de progresso de duas camadas (com 2 barras de progresso).Um mostrando o progresso geral (0 a 100%) e outro mostrando o progresso por arquivo (à medida que cada arquivo é baixado).

Dessa forma, desde que você saiba a quantidade de arquivos a serem carregados, você poderá fazer o progresso total sem precisar primeiro acessar o servidor para obter os tamanhos dos arquivos.

câmaras de microfone

mesh@adobe.com

Outras dicas

A ideia de Mike Chamber irá ajudá-lo, mas ainda será mais lento do que usar algo no servidor, já que você terá que fazer uma solicitação para cada arquivo de qualquer maneira.É essencialmente o mesmo que você mesmo está dizendo, mas quando você solicita explicitamente os cabeçalhos, será um pouco mais rápido.Use um Socket para fazer a solicitação:

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 for absolutamente necessário controlar como os arquivos são carregados, acredito que a sugestão de Mike Chambers de fazer uma solicitação HTTP HEAD é o caminho a seguir.

No entanto, a menos que haja um bom motivo para não fazê-lo, eu simplesmente começaria a carregar todos os arquivos de uma vez e obteria os tamanhos dos arquivos a partir do método getBytesTotal de cada arquivo.Como o Flash obtém sua pilha de rede do navegador, o número de arquivos realmente carregados simultaneamente estará em conformidade com as configurações do navegador (definidas pelo usuário).

O seguinte é apenas para fins de exemplo.Em um caso real, eu não usaria o Timer, teria um array ou objeto XML para iterar com um loop for, independentemente de funcionar muito bem e basicamente quando você atingir o final do loop (por exemplo,if(i == (length - 1)) faça com que ele chame a funcionalidade que inicia o pré-carregamento real agora que temos nosso total.Agora iteramos novamente pelo array ou objeto XML, mas desta vez fazemos isso apenas depois que cada ativo for carregado, não em um loop for.Esse método assíncrono pode então ficar ali e comparar a quantidade de dados que carregou e dividir pelo total encontrado anteriormente, fornecendo sua porcentagem.

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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top