Pergunta

Eu estou procurando uma maneira simples de encontrar os tamanhos dos arquivos eu pensando em carregamento de arquivo sem carregá-los ainda. Basicamente, eu estou fazendo um lote de arquivos que precisa ser carregado e que seria muito útil se eu poderia determinar em antemão quão grande é a carga total vai ser.

o objeto Loader em flash tem uma propriedade totalBytes, mas que só irá retornar um valor quando você já está carregando um arquivo.

Foi útil?

Solução

Por carregado, você quer dizer totalmente carregada, ou com nenhuma chamada carga? Se uma chamada de carga é aceitável, o seguinte poderia ser útil. O evento de progresso dá o dados de entrada Tamanho total no primeiro fogo. Nós apenas vamos um determinado fogo evento progress, tomar o valor total do item de carga atual e acrescentar que a nossa própria variável _total; Continuamos este até a dataprovider (matriz, XML, etc) está vazio. até o final você tem a soma de todos os seus ativos totais.

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

Assim que carregar um ativo apenas o tempo suficiente para anexar seu total tamanho, à nossa própria variável _total e, em seguida, chamamos o próximo item na matriz e acrescentar seu total até que o provedor de dados está vazio. Obviamente, isso poderia ser feito com XML, ou como quiser, uma matriz é apenas o que eu usei para o exercício.

Outras dicas

Não há nenhuma maneira de obter o tamanho de um arquivo antes de Actionscript 3. Uma solução fácil seria adicionar um pequeno script para o servidor que verifica para todos os arquivos e retorna os seus nomes e seu tamanho para o swf (como JSON ou XML ou qualquer outro).

Não há nenhuma maneira de fazer isso no ActionScript. Você vai precisar de algum código do lado do servidor para fazer isso. Você poderia criar um método que leva um nome de arquivo e retorna o total de bytes.

Eu não sei como você faria isso com actionscript (Eu não sou nenhum guru), mas o meu primeiro palpite seria usar um script PHP (ou qualquer outra linguagem de script de sua escolha) para obter os tamanhos de arquivo e de retorno os valores.

Outro (provavelmente um exagero) forma seria a de criar algo que simplesmente pede o servidor para os cabeçalhos do arquivo (incluindo o tamanho do arquivo). O mesmo poderia ser alcançado simplesmente começar a baixar o arquivo e fechar o fluxo quando você tem o tamanho do arquivo (deve ser bastante rápido) ou ter (como sugerido antes) alguma outra forma de pedir o servidor para o tamanho do arquivo (útil se você está a carregar arquivos múltiplos e precisa saber o tamanho do arquivo antes do carregamento)

Eu experimentei com o método fornecido por Brian Hodge, bem como um outro método em que eu mandei variáveis ??(pasta locais como cadeias de XML) para PHP, a fim de obter o tamanho combinado de todos os arquivos dentro de uma pasta específica e regresso os dados para o flash.

Um grande problema que eu encontrei em minha viagem para o pré-carregamento paraíso era que o Flash Player parece produzir resultados inconsistentes em relação ao tamanho do arquivo! Mesmo se eu carregado exatamente os mesmos arquivos de duas vezes o Flash iria me dizer que eles estavam tamanhos diferentes ... às vezes.

Este também causou problemas com o método alternativo (PHP), uma vez que o script PHP produziria (aparentemente) resultados de tamanho de arquivo precisos que eram incompatíveis com os produzidos por Flash, causando o meu carregador para ir para 85% ou 128%, dependendo em cache e humor de inflamação: /

Eu desfeito ambos os métodos em favor de uma boa classe chamada bulk-loader , que permite o carregamento em fila e controle de progresso de vários itens, e muito mais: D

Esteja ciente de que ele irá aumentar o tamanho do arquivo SWF significativamente ... como irónico

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top