2009-03-01 1 views
1

私は読み込みを予定しているファイルのファイルサイズを簡単に見つける方法を探しています。基本的には、ロードする必要があるファイルのバッチを作成しており、事前に合計負荷がどれくらい大きくなるかを判断できる場合は非常に便利です。実際にファイルをロードする前にtotalBytesにアクセスしているFlash

flashのLoaderオブジェクトにはtotalBytesプロパティがありますが、これはファイルをロードしているときにのみ値を返します。

答えて

2

ロードされているかどうか、読み込み中でないことを意味しますか?ロードコールが受け入れ可能な場合は、次のようにすると便利です。進捗イベントは、着信データの最初の発射時の合計サイズを示します。与えられた進捗イベントを起動させ、現在のロードアイテムの合計値を取得し、それを_total変数に追加するだけです。データプロバイダ(配列、xmlなど)が空になるまでこれを続けます。結局、あなたの資産総額の合計があります。

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

だから我々は我々自身の_Total変数に、ちょうど十分な長さのサイズの合計を追加する資産をロードし、我々は、アレイ内の次の項目を呼び出し、データプロバイダが空になるまでその合計を追加します。明らかに、これはXMLで行うことができますが、配列はちょうど私がこのエクササイズに使ったものです。

+0

のような音かなり良い解決策。私はそれが(ロードコールを避ける)ことが願っている限り清潔ではありません。しかし、これは動作します。ありがとう! – Kasper

+0

必要なデータにアクセスするには、URLLoaderとLoaderが必要です。リスナをきれいにしたり再利用したりして、最後を取り除く限り、実装に間違いはありません。良い質問ありがとう。がんばろう! –

1

ファイルのサイズをActionscript 3から取得する方法はありません。簡単な解決策は、すべてのファイルをスキャンし、名前とサイズをswf(JSONまたはXMLなど)に戻す小さなスクリプトをサーバーに追加することです。

0

ActionScriptでこれを行う方法はありません。これを行うには、サーバー側のコードが必要になります。ファイル名を取り、合計バイト数を返すメソッドを作成できます。

0

actionscript(私は専門家ではありません)でこれをどうやって行うのか分かりませんが、私の最初の推測は、PHPスクリプト(または任意の他のスクリプト言語)を使用してファイルサイズと値を返します。

0

別の(おそらく過度の)方法は、サーバーにファイルのヘッダー(ファイルサイズを含む)を要求するだけのものを作成することです。ファイルをダウンロードしてストリームを閉じる(かなり速くなければならない)か、(以前に示唆したように)サーバーにファイルのサイズを求める他の方法があると便利です複数のファイルを読み込んでいて、読み込む前にファイルサイズを知る必要がある場合)

0

私はBrian Hodgeが提供する方法と、特定のフォルダ内のすべてのファイルの合計サイズを取得するために変数(XMLからの文字列としてのフォルダの場所)をPHPに送信する別の方法を試しています。 Flashにデータを返します。

私がパラダイスをプリロードする旅に遭遇した大きな問題の1つは、Flash Playerがファイルサイズに関して一貫性のない結果を生成しているようだということです!私が正確に同じファイルを2回ロードしたとしても、Flashはそれらが異なるサイズであると私に言っていました。

これは、PHPスクリプトが(一見)正確なファイルサイズの結果をFlashによって生成されたものと矛盾して生成し、ローダーが85%または128%になるため、代替(PHP)キャッシュとFlashの気分に依存:/

私は、複数の項目のキューに入れられた読み込みと進捗状況の追跡が可能になりますbulk-loaderと呼ばれる素敵なクラス、賛成の両方の方法を廃棄し、そしてはるか:D

はちょうどその注意してくださいそれはあなたのswfファイルのサイズを大幅に増加させる...どのように皮肉

関連する問題