AS3上传速度测试

时间:2012-02-13 09:01:03

标签: flash actionscript-3 upload urlloader speed-test


我正在AS3上做最快的速度。并且遇到了这样的问题 我在我的测试中使用URLLoader( ),并且对于下载测试它工作得非常好,但是对于上传测试我遇到了一些麻烦。我正在向我的php脚本发送一些二进制数据,并检查progress_event以获取bytesLoaded,以计算当前速度,但事件未调度,只有complete_event出现时整个文件被发送。那么如何通过字节发送过程来确定速度呢?

P.S。我无法使用fileReference,因为我一个接一个地使用我的测试,无法让用户在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全部,我将很快发布解决方案。

6 个答案:

答案 0 :(得分:1)

尝试添加此功能,看看是否收到错误消息。这可能是问题所在。

_loader.addEventListener("ioError", ldrError);    

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

可能是你的php脚本存在问题。

答案 1 :(得分:1)

尝试添加 ENTER_FRAME 侦听器,并从_loader实例中提取bytesLoaded,而不是依赖 ProgressEvent 触发。如果ENTER_FRAME有效,则可以尝试在短暂的延迟时用重复的 TimerEvent 替换它,以减少ENTER_FRAME的处理负荷。

我现在无法对此进行测试,但这至少应该让您知道ProgressEvent是否存在触发或流媒体本身的问题。

答案 2 :(得分:0)

也许我已经找到它了,不要使用附带的下载模拟器,真实上传/下载它会起作用!

答案 3 :(得分:0)

很奇怪您在下载方向上测试的速度有多快以及您是否遇到过Windows系统的任何问题?我似乎在使用各种浏览器的Windows系统中遇到某种瓶颈,我的下载速度最高可达~25Mbps。在Mac OS和Linux系统上,我的线速度约为100Mbps。

答案 4 :(得分:0)

听起来像服务器脚本中有错误。哪个会快速返回一个不会触发progressEvent的响应。
在这种情况下,可能会返回类似错误代码的消息,等等等等等等。这样的情况会触发整个事件,因为客户端确实得到了答复。 (200 OK)


你验证过服务器端脚本没问题吗?

答案 5 :(得分:0)

您的ProgressEvents未触发的原因是它们与您请求的 download 部分(即来自服务器的响应)有关,而不是上传部分。如果服务器响应相当大(例如,以大图像的形式),您肯定会看到ProgressEvents,但由于您的脚本只返回少量文本,因此在上载完成后很快就会完成,之后URLLoader随时可以调度ProgressEvent。

正如您所提到的,使用FileReference类是Flash可以对正在进行的上传进行内省的唯一方法,但当然它会带来许多限制。

我的建议是使用已知大小的POST有效负载设置URLLoader,然后在调用load方法之前存储new Date().getTime()。返回COMPLETE事件后,再次获取当前时间,并进行比较以获得基于有效负载大小的平均上载速率。请注意,这只是近似值,因为它也不可避免地包含下载部分,因此您计算的速度将略低于实际值。

另一个解决方法是监控服务器端上传的运行进度和速度,并通过让Flash定期调用单独的上载进度脚本来报告此问题,直到数据全部转移完毕。