我正在使用 AS3 进行速度测试,并遇到了一个问题。在我的测试中,我使用
URLLoader( )
,下载测试很好,但是上传测试却有些麻烦。我将一些二进制数据发送到我的 php 脚本,并检查 progress_event
来获取 bytesLoaded
,计算当前速度,但是事件不会被触发,只有在整个文件发送完成后才会出现 complete_event
。那么如何通过字节发送过程来确定速度呢?P.S. 我不能使用 fileReference
,因为我一个接一个地使用我的测试,不能让用户点击 filebrowse() 对话框。
谢谢。
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();
}
}
更新: 我的php脚本:
<?
$postdata = file_get_contents("php://input");
file_put_contents("inp.bin",var_export($postdata,true));
echo "Done";
?>
是的,它很小,但我真的不需要数据,我需要检查上传速度有多快。
更新2
所以,在阅读了所有答案、评论并进行了数小时的谷歌搜索后,我可能已经找到了解决方案,但它的实现方式与我最初希望的不同。无论如何,非常感谢大家,我会很快发布解决方案。
addEventListener
来设置事件监听器。 - vulkaninoEvent.COMPLETE
触发良好。 - DenURLLoader
,而不是FileReference
。在这里,Event.PROGRESS
只会在接收到数据时触发,而不是发送数据时触发。 - Den