2009-03-01 13 views
1

Ich bin auf der Suche nach einem einfachen Weg, um die Dateigrößen der Dateien zu finden, die ich beim Laden planen, ohne sie noch zu laden. Ich mache im Grunde einen Stapel von Dateien, die geladen werden müssen, und es wäre sehr nützlich, wenn ich im Voraus bestimmen könnte, wie groß die Gesamtlast sein wird.Flash, Zugriff auf totalBytes vor dem tatsächlichen Laden der Datei

Das Loader-Objekt im Flash hat eine totalBytes-Eigenschaft, die jedoch nur dann einen Wert zurückgibt, wenn Sie bereits eine Datei laden.

Antwort

2

Mit "geladen" meinen Sie vollständig geladen oder ohne Ladeaufruf? Wenn ein Ladeaufruf akzeptabel ist, könnte Folgendes nützlich sein. Das Fortschrittsereignis gibt die Gesamtgröße der eingehenden Daten beim ersten Brand an. Wir lassen nur ein gegebenes Fortschrittsereignis feuern, nehmen den Gesamtwert des aktuellen Ladeelements und addieren das zu unserer eigenen _total-Variablen; Wir fahren fort, bis unser Datenprovider (Array, XML, usw.) leer ist. Am Ende haben Sie die Summe aller Ihrer Vermögenswerte insgesamt.

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

So laden wir einen Vermögenswert gerade lang genug, um seine Größe insgesamt zu unserer eigenen _total Variable anhängen und dann nennen wir das nächste Element in dem Array und seine Gesamt anhängen, bis der Datenprovider ist leer. Natürlich könnte dies mit XML gemacht werden, oder wie Sie es wünschen, ein Array ist genau das, was ich für die Übung verwendet habe.

+0

Klingt wie ein ziemlich gute Lösung. Nicht so sauber, wie ich es mir erhofft hätte (Vermeiden von Lastwechseln). Aber das wird funktionieren. Vielen Dank! – Kasper

+0

URLLoader und Loader sind notwendig, um auf die Daten zuzugreifen, die Sie benötigen, und solange Sie Ihre Listener sauber und/oder wiederverwenden und das Finale entfernen, sehe ich nichts falsch mit der Implementierung. Danke für die gute Frage. Viel Glück! –

1

Es gibt keine Möglichkeit, die Größe einer Datei vorher von Actionscript 3 zu erhalten. Eine einfache Lösung wäre, dem Server ein kleines Skript hinzuzufügen, das nach allen Dateien sucht und ihre Namen und ihre Größe an swf zurückgibt (wie JSON oder XML oder was auch immer).

0

Dies ist in ActionScript nicht möglich. Sie benötigen dazu einen serverseitigen Code. Sie können eine Methode erstellen, die einen Dateinamen annimmt und die Gesamtzahl der Bytes zurückgibt.

0

Ich weiß nicht, wie Sie das mit Actionscript machen würden (ich bin kein Guru), aber meine erste Vermutung wäre, ein PHP-Skript (oder eine andere Skriptsprache Ihrer Wahl) zu verwenden, um die Dateigrößen und gib die Werte zurück.

0

Eine andere (wahrscheinlich Overkill) Möglichkeit wäre, etwas zu erstellen, das den Server einfach nach den Headern der Datei fragt (einschließlich der Dateigröße). Das gleiche könnte erreicht werden, indem einfach die Datei heruntergeladen und der Stream geschlossen wird, wenn Sie die Dateigröße haben (sollte ziemlich schnell sein) oder eine andere Möglichkeit haben, den Server nach der Größe der Datei zu fragen (nützlich Wenn Sie mehrere Dateien laden und vor dem Laden die Dateigröße kennen müssen)

0

Ich habe mit der Methode von Brian Hodge experimentiert, sowie eine andere Methode, in der ich Variablen (Ordnerorte als Strings aus XML) an PHP gesendet, um die kombinierte Größe aller Dateien in einem bestimmten Ordner zu erhalten Geben Sie die Daten in Flash zurück.

Ein großes Problem, das ich auf meiner Reise zum Pre-Loading-Paradies hatte, war, dass Flash Player inkonsistente Ergebnisse in Bezug auf die Dateigröße zu produzieren scheint! Selbst wenn ich genau dieselben Dateien zweimal laden würde, würde Flash mir sagen, dass sie unterschiedliche Größen haben ... manchmal.

Dies verursachte auch Probleme mit der alternativen (PHP) -Methode, da das PHP-Skript (scheinbar) genaue Ergebnisse der Dateigröße erzeugen würde, die mit denen von Flash inkonsistent waren, was dazu führte, dass mein Loader auf 85% oder 128% ging. abhängig von Caching und Flash-Stimmung:/

ich beide Methoden für eine nette Klasse verschrottet bulk-loader genannt, die für die Warteschlange gestellt Laden und Fortschritt Verfolgung mehrerer Objekte und vieles mehr erlaubt: dass D

Seien Sie sich bewusst, dass es wird Ihre swf Dateigröße erheblich erhöhen ... wie ironisch

Verwandte Themen