1

わかりました。現在、SWF が php ファイルにヒットし、指定したすべてのファイルを見つけて、それらのサイズを合計し、それらの合計サイズを 1 つの数値として返します。次に、この数値を ProgressEvent リスナーで使用して、Web サイトの特定のセクションで現在ダウンロードされているファイルの割合を判断します。

かなり簡単ですよね?さて、そのPHPファイルを使用することは問題外であり、必要な数値を取得するために外部スクリプトにヒットさせるのではなく、SWF内ですべてを実行しようとしています.

ファイルをフラッシュにロードする前にファイルのサイズを取得する良い方法はありますか? プリローダーを 0 ~ 100% のプリローダーにする必要があるため、実際に開始する前にダウンロードする総バイト数が必要です。

ファイルの URL を保持する配列を調べて読み込みを開始し、読み込みを表示せずに getTotalBytes を取得し、最初のティックで読み込みを終了し、それらの合計バイト数をすべて合計してから、実際のダウンロード プロセスを開始するという考えがありました。この方法は非常に醜いように見え、ユーザーがサイトでプリローダーにアクセスするたびに、すべてのファイルを実行し、それらの合計を見つけてから実際にダウンロードを開始するのにおそらく 1 ~ 2 秒かかるため、膨大な時間の無駄になります。

これらのファイルのサイズを取得するためにフラッシュの外に出ずに、この問題に対するより良い解決策はありますか?

4

4 に答える 4

2

ファイルのサーバーに対して HTTP HEAD リクエストを実行できます。これにより、ヘッダー情報 (ファイル サイズを含む) が返されますが、実際のファイルは返されません。次に、ファイルをロードするための GET 要求を行うことができます。

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

(セクション 9.4 HEAD を参照)

私がおそらく行うことは、2 層のプログレス バー (2 つのプログレス バーを含む) です。1 つは全体的な進行状況 (0 から 100%) を示し、もう 1 つはファイルごとの進行状況 (各ファイルがダウンロードされるとき) を示します。

そうすれば、ロードするファイルの数がわかっている限り、最初にサーバーにアクセスしてファイル サイズを取得する必要なく、全体の進行状況を確認できます。

マイク・チェンバーズ

mesh@adobe.com

于 2008-09-15T22:32:50.947 に答える
1

Mike Chamber のアイデアは役に立ちますが、とにかく各ファイルに対してリクエストを行う必要があるため、サーバーサイドで何かを使用するよりも遅くなります。それは本質的にあなたが自分で言っていることと同じですが、ヘッダーを明示的に要求している場合は少し速くなります. Socket を使用してリクエストを実行します。

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 += "ホスト: yourserver.com\r\n";
    ヘッダー += "\r\n\r\n";
    socket.writeUTFBytes(ヘッダー);
    socket.flush( );
}

関数 dataHandler( event : ProgressEvent ) : void {
    trace( "受信したヘッダー\n" );
    trace( socket.readUTF( socket.bytesAvailable ) );
}
于 2008-09-16T00:06:25.140 に答える
0

If it's absolutely necessary to control how the files are loaded, then I believe Mike Chambers' suggestion to make an HTTP HEAD request is the way to go.

However, unless there's a good reason not to, I'd simply begin loading all the files at once and get my file sizes from each file's getBytesTotal method. Since Flash gets its network stack from the browser, the number of files actually loaded concurrently will conform to the (user-definable) browser settings.

于 2008-09-16T02:42:44.857 に答える
0

以下は単なる例です。実際のケースでは、Timer を使用しません。配列または XML オブジェクトを for ループで反復処理しますが、うまく機能し、基本的にループの最後に達すると (例: if(i == (length - 1 )) 合計が得られたので、実際のプリロードを開始する機能を呼び出します. 次に、配列または XML オブジェクトを再度反復処理しますが、今回は for ループではなく、各アセットがロードされたときにのみ実行しますこの非同期メソッドは、そこに座って、ロードされたデータの量を比較し、それを以前に見つかった合計で割り、パーセンテージを得ることができます。

var totalBytes:Number = 0;

var loader:Loader = new Loader();
var request:URLRequest = 新しい URLRequest();
request.url = 'badfish.jpg';

var timer:Timer = new Timer(200);
timer.addEventListener(TimerEvent.TIMER, onTimer);

関数 onTimer(e:TimerEvent)
{
    loader.load(リクエスト);
    loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, onProgress);
}
関数 onProgress(e:ProgressEvent):void
{
    totalBytes+=e.bytesTotal;
    trace(e.bytesTotal,totalBytes);
    loader.contentLoaderInfo.removeEventListener(ProgressEvent.PROGRESS, onProgress);
}

timer.start();
于 2008-09-24T08:28:06.167 に答える