私は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すべて、私はすぐにソリューションを投稿します。
あなたのコードはどこですか? 'addEventListener'でイベントリスナーを設定する必要があります。 – vulkanino
'_loader = new URLLoader(); _loader.dataFormat = URLLoaderDataFormat.BINARY; _loader.addEventListener(Event.COMPLETE、uploadComplete); _loader.addEventListener(ProgressEvent.PROGRESS、uploadProgress); ' すべてはOKですが、イベントだけがディスパッチしていません... – Den
あなたのアンチウイルスソフトウェアを無効にしようとしましたか? http://stackoverflow.com/questions/2930513/monitoring-file-upload-progress-in-actionscript-3を参照してください。 – Creynders