Question

Je cherche un moyen simple de trouver la taille des fichiers que je prévois de charger sans les charger pour le moment. Je crée en gros un lot de fichiers qui doit être chargé et il serait très utile que je puisse déterminer à l'avance quelle sera la charge totale.

l'objet Loader en flash a une propriété totalBytes, mais cela ne renverra une valeur que lorsque vous chargez déjà un fichier.

Était-ce utile?

La solution

Par chargé, voulez-vous dire entièrement chargé ou sans appel de charge? Si un appel de charge est acceptable, les éléments suivants pourraient être utiles. L'événement progress donne la taille totale des données entrantes lors du premier déclenchement. Nous laissons simplement un événement de progression donné se déclencher, prenons la valeur totale de l’élément de chargement actuel et l’ajoutons à notre propre variable _total; Nous continuons ainsi jusqu'à ce que notre fournisseur de données (array, xml, etc.) soit vide. à la fin, vous avez la somme de tous vos actifs.

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

Nous chargeons donc un actif assez longtemps pour ajouter son total Taille à notre propre variable _total, puis nous appelons l'élément suivant du tableau et ajoutons son total jusqu'à ce que le fournisseur de données soit vide. Évidemment, cela pourrait être fait avec XML, ou comme vous le souhaitez, un tableau est exactement ce que j'ai utilisé pour l'exercice.

Autres conseils

Il n’existe aucun moyen d’obtenir la taille d’un fichier auparavant à partir de Actionscript 3 . Une solution simple consisterait à ajouter au serveur un petit script qui analyse tous les fichiers et renvoie leur nom et leur taille au swf (sous forme de JSON ou XML ou autre). .

Il n’existe aucun moyen de le faire dans ActionScript. Pour ce faire, vous aurez besoin d’un code côté serveur. Vous pouvez créer une méthode qui prend un nom de fichier et renvoie le nombre total d'octets.

Je ne sais pas comment procéder avec actionscript (je ne suis pas un gourou), mais ma première hypothèse serait d'utiliser un script PHP (ou tout autre langage de script de votre choix) pour obtenir la taille du fichier et le renvoyer. les valeurs.

Un autre moyen (probablement excessif) consiste à créer quelque chose qui demande simplement au serveur les en-têtes du fichier (y compris la taille du fichier). La même chose pourrait être obtenue simplement en commençant à télécharger le fichier et en fermant le flux lorsque vous avez la taille du fichier (devrait être assez rapide) ou en ayant (comme suggéré précédemment) un autre moyen de demander au serveur la taille du fichier (utile si vous chargez plusieurs fichiers et devez connaître la taille du fichier avant de le charger)

J'ai expérimenté la méthode fournie par Brian Hodge, ainsi qu'une autre méthode d'envoi de variables (emplacement des dossiers sous forme de chaînes XML) à PHP afin d'obtenir la taille combinée de tous les fichiers d'un dossier particulier et de renvoyer les données à Flash.

Un des problèmes majeurs que j'ai rencontré lors de mon voyage au paradis de préchargement est que Flash Player semble produire des résultats incohérents en ce qui concerne la taille du fichier! Même si je chargeais deux fois exactement les mêmes fichiers, Flash me dirait qu’ils étaient de tailles différentes ... parfois.

Cela posait également des problèmes avec la méthode alternative (PHP), car le script PHP produirait (apparemment) des résultats de taille de fichier précis et incohérents avec ceux produits par Flash, ce qui ferait passer mon chargeur à 85% ou 128%, dépendant sur la mise en cache et l'humeur de Flash: /

J'ai abandonné les deux méthodes au profit d'une belle classe appelée bulk-loader . , qui permet le chargement en file d'attente et le suivi de la progression de plusieurs éléments, et bien plus encore: D

Sachez simplement que cela augmentera considérablement la taille de votre fichier swf ... quelle ironie

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top