2012-02-13 21 views
3


私はAS3でスピードテストを行っています。そして、そのような問題がある。
私のテストではURLLoader()を使用していますが、ダウンロードテストではうまくいきますが、テストをアップロードするためにいくつかの問題があります。私はいくつかのバイナリデータをPHPスクリプトに送り、を取得し、現在の速度を計算するためにprogress_eventをチェックしていますが、イベントがディスパッチされていないので、ファイル全体が送信されたときにのみcomplete_eventが表示されます。だから、どのようにバイト送信プロセスによって速度を決定することができますか?
AS3アップロード速度テスト

P.S. fileReferenceを使用できません。テストを1つ1つ使用しているため、ユーザーがfilebrowse()ダイアログをクリックできません。

Thx。

 public function startme():void { 

      _startTime = (new Date()).getTime(); 

     var req:URLRequest = new URLRequest(); 
     req.url = "http://smart.t3a.ru/speedtest/test.php"; 
     req.contentType = 'application/octet-stream'; 
     req.method = URLRequestMethod.POST; 
     req.data = Obj; 

     //req.requestHeaders.push(new URLRequestHeader('Cache-Control', 'no-cache')); 

     _loader = new URLLoader(); 
     _loader.dataFormat = URLLoaderDataFormat.BINARY; 
     _loader.addEventListener(Event.COMPLETE,uploadComplete); 
     _loader.addEventListener(ProgressEvent.PROGRESS, uploadProgress); 
     _loader.addEventListener(HTTPStatusEvent.HTTP_STATUS, onstatus); 
     _loader.addEventListener(IOErrorEvent.IO_ERROR, eIOError); 
     _loader.load(req); 


    } 

    private function onstatus(event:HTTPStatusEvent):void 
    { 
     trace(event); 
    } 
    private function eIOError(event:IOErrorEvent):void 
    { 
     trace(event); 
    } 

    private function uploadComplete(e:Event):void 
    { 
     var endTime:Number = (new Date()).getTime(); 
     var totalTime:Number = (endTime - _startTime)/1000; 

     var totalKB:Number = Obj.length * 8/1024; 
     //_speed = totalKB/totalTime; 

     if (debug) 
     { 
      trace("U total time: " + totalTime + " total KB: " + totalKB + " speed: " + speed + "KBps"); 
     } 

     dispatchEvent(e); 
    } 

    private function uploadProgress(e:ProgressEvent):void 
    { 
     var endTime:Number = (new Date()).getTime(); 
     var totalTime:Number = (endTime - _startTime)/1000; 
     if (totalTime > 1) 
     { 
      var totalKB:Number = e.bytesLoaded * 8/1024; 
      _speed = totalKB/totalTime; 

      if (debug) 
      { 
       trace("u total time: " + totalTime + " total KB: " + totalKB + " speed: " + speed + "KBps"); 
      } 
      dispatchEvent(e); 

     } 
     if (totalTime > 7) 
     { 

      var ec:Event = new Event(Event.COMPLETE); 
      _loader.dispatchEvent(ec); 
      _loader.close(); 
     } 
    } 

UPD 私のPHPスクリプト:

<? 
    $postdata = file_get_contents("php://input"); 
    file_put_contents("inp.bin",var_export($postdata,true)); 
    echo "Done"; 
    ?> 

はい、それは小さなだが、私は本当に私はそれがアップロードされているどのくらいの速チェックする必要があり、データを必要としません。

UPD 2

だから、私が最初に希望よりも、すべての答えを読んでコメントや時間のグーグル後、私はおそらく解決策を得たが、それは、いくつかの異なる方法で行われています。とにかくTYVMすべて、私はすぐにソリューションを投稿します。

+0

あなたのコードはどこですか? 'addEventListener'でイベントリスナーを設定する必要があります。 – vulkanino

+0

'_loader = new URLLoader(); _loader.dataFormat = URLLoaderDataFormat.BINARY; _loader.addEventListener(Event.COMPLETE、uploadComplete); _loader.addEventListener(ProgressEvent.PROGRESS、uploadProgress); ' すべてはOKですが、イベントだけがディスパッチしていません... – Den

+0

あなたのアンチウイルスソフトウェアを無効にしようとしましたか? http://stackoverflow.com/questions/2930513/monitoring-file-upload-progress-in-actionscript-3を参照してください。 – Creynders

答えて

1

これを追加して、エラーが発生していないかどうかを確認してください。それは問題かもしれません。

_loader.addEventListener("ioError", ldrError);  

function ldrError(evt:*):void 
{ 
    trace("ERROR"); 
} 

あなたのPHPスクリプトに問題がある可能性があります。

+0

まず、バイナリデータを扱うのに 'Loader'の代わりに' URLLoader'を使い、 'URLLoader'は' contentLoaderInfo'プロパティを持っていません。そして最後に、私はIOErrorハンドラを持っていますが、何もトレースしていません。したがって、完全なデータがアップロードされた後でも 'uploadComplete'イベントが送出されますが、進捗は送出されません。私はすぐに最初の投稿があれば、私のコード全体を入れておきます。 – Den

0

多分私はそれを見つけました。含まれているダウンロードシミュレータを使用せず、アップロード/ダウンロードして実際に動作します。

+0

良いコール=)でも結果はありません。私の問題は、POST要求がサーバーに「固体」で送信され、部分的にチャンクされていないため、 'Event.COMPLETE'だけがディスパッチしているということです。これ以上何もない。私はストリームや別の速度計算方法のようなスマッシングを使う必要があると思う。 – Den

+0

errrm、それは約SOCKET_DATA =でした)。そして、あなたはダウンロードシミュレータのために何を話していますか? – Den

1

代わりのによってProgressEvent焼成に頼って、ENTER_FRAMEリスナーを追加してみてくださいと_loaderインスタンスからbytesLoadedプロパティを引き出します。 ENTER_FRAMEが機能している場合、ENTER_FRAMEの処理負荷を軽減するために、短い遅延でTimerEventの繰り返しで置き換えることができます。

私はこれを今はテストすることができませんが、少なくとも発火していないProgressEventやストリーミング自体に問題があるかどうかを知らせる必要があります。

+0

ありがとうございます。私は 'TimerEvent'を作成しましたが、問題があります。 'bytesLoaded'は** recieved **バイトの量を返しますが、** sent **バイトを数える必要があります。 – Den

+0

振り返ってみると、明らかに予想される動作です。その場合、私はあなたがFlashの範囲外に行かなければならないと言いたいと思います。あなたのPHPスクリプトで何が起こっているのか分かりませんが、アップロードが本当にストリーミングされてアップロード中に(FTPなどで)サーバーに保存されている場合、TimerEventハンドラ内で2番目のPHPスクリプトをポーリングしますストリーミング中のファイルに対して** filesize()**を呼び出してFlashに返します。 – DNJohnson

0

ダウンロードの速さでどの程度速くテストできたのか、Windowsシステムに問題が発生したのかどうか不思議ですか?私はWindowsシステムでボトルネックに遭遇しているようですが、私のダウンロードが〜25Mbpsで最大になるさまざまなブラウザを使用しています。 Mac OSやLinuxシステムでは、〜100Mbpsの回線速度になります。

+0

ダウンロードは大丈夫です。スピードテストの結果とほぼ同じです。毎秒受信したバイトを数えます。それは疑問ではない。 – Den

0

サーバスクリプトのような私には聞こえないですが、それに誤りがあります。 progressEventをトリガーしない応答を速く返します。
この場合、XX行にエラーコードblah blah blahのようなものが返されることがあります。
このようなケースは、クライアントが応答を得たので完全なイベントを発生させます。 (200 OK)


サーバー側のスクリプトが正常であることを確認しましたか?

+0

はい、問題ありません。そして、「完全な」イベントがうまくいきますが、それは私が必要なものではありません。 – Den

+0

私はまだあなたが私が言っていることを理解している販売されていません。サーバーからの応答をトレースし、データが必要なものであることを確認しましたか?サーバー側の問題がないという完全なイベントが得られたと仮定しないでください。 –

+0

私たちは**アップロード**部分について話しています。ダウンロードテストはうまくいって、進歩は発動し、バイトは数えられます。しかし、**アップロード**部分はありません。 'ProgressEvent'は着信バイト数をカウントしていますが、私はoutcomingが必要です。はい、 'completeEvent'に" delta Time/totalBytes "のようなアップロード速度を得る方法がありますが、アップロードプロセス中に動的にカウントする必要があります。 – Den

0

ProgressEventsが発生しないのは、アップロード部分ではなく、ダウンロードのダウンロードの部分(サーバーからの応答)の部分に関連するためです。サーバーの応答がかなり大きかった場合(たとえば、大きな画像の形で)、ProgressEventsが表示されますが、スクリプトが少量のテキストを返すだけなので、アップロードが完了した後、 URLLoaderがProgressEventを送出する任意の時間です。

前述のように、FileReferenceクラスを使用するのは、進行中のアップロードでFlashがイントロスペクトできる唯一の方法ですが、もちろんそれにはいくつかの制限があります。

私の助言は、既知のサイズのPOSTペイロードでURLLoaderをセットアップしてから、loadメソッドを呼び出す直前にnew Date().getTime()を格納することです。 COMPLETEイベントが返されたら、再度現在の時刻を取得し、比較してペイロードのサイズに基づいて平均アップロードレートを取得します。これは必然的にダウンロード部分も組み込まれているため、おおよその値に過ぎないので、計算された速度は実際よりもわずかに低くなります。

もう1つの回避策は、サーバー側のアップロードの進行状況と速度を監視し、データがすべて転送されるまでFlashが定期的に別のアップロード進捗スクリプトを呼び出すようにすることです。

関連する問題