我正在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全部,我将很快发布解决方案。
答案 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定期调用单独的上载进度脚本来报告此问题,直到数据全部转移完毕。