我想获得用户的上传速度的粗略估计没有得到直接的许可。 这仅仅是区分非常快的人真的很慢连接,因此精度不是超级重要...
Answer 1:
下面是该使用的实现XMLHttpRequest
扩大对@YiğitYener的想法。
上传速度取决于两件事情:用户的连接速度和服务器的连接速度。 我在这里所做的假设是要测试用户和服务器之间的速度。 并与XMLHttpRequest
,那是因为真的是唯一的选择同源策略 。
随着上传速度,你不需要任何回报。 你只需要POST
大块数据的任何网页的服务器上。 打最简单的页面是你已经在一个。 要做到这一点,你可以在排除所有离开网址的域名部分.open()
POST
数据在某些服务器上限制为两兆,所以我用一个是安全的。 其一是足以让一个体面的阅读。
为了防止URL被缓存,我附上一个随机数到最后。
url = '?cache=' + Math.floor( Math.random() * 10000 )
为了防止POST
被gzip压缩的数据,我用随机数据。 该功能允许您通过您要检查的迭代次数。 迭代间隔出每五秒钟。 该update
回调函数被调用与检查的速度,所有的检查的移动平均每个迭代。 如你希望得到您想要的精确度,使用尽可能多的迭代。 如果你只是想要一个粗略的估计,一个迭代就足够了。
这就是所谓的是这样的:
checkUploadSpeed( 10, function ( speed, average ) {
} );
演示
你可以在这里试试这个代码。
专用服务器
你可以试试这个ThinkingStiff自己的服务器 ,这可能是最快的这些所有的。
堆栈片段
function checkUploadSpeed( iterations, update ) { var average = 0, index = 0, timer = window.setInterval( check, 5000 ); //check every 5 seconds check(); function check() { var xhr = new XMLHttpRequest(), url = '?cache=' + Math.floor( Math.random() * 10000 ), //random number prevents url caching data = getRandomString( 1 ), //1 meg POST size handled by all servers startTime, speed = 0; xhr.onreadystatechange = function ( event ) { if( xhr.readyState == 4 ) { speed = Math.round( 1024 / ( ( new Date() - startTime ) / 1000 ) ); average == 0 ? average = speed : average = Math.round( ( average + speed ) / 2 ); update( speed, average ); index++; if( index == iterations ) { window.clearInterval( timer ); }; }; }; xhr.open( 'POST', url, true ); startTime = new Date(); xhr.send( data ); }; function getRandomString( sizeInMb ) { var chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789~!@#$%^&*()_+`-=[]\{}|;':,./<>?", //random data prevents gzip effect iterations = sizeInMb * 1024 * 1024, //get byte count result = ''; for( var index = 0; index < iterations; index++ ) { result += chars.charAt( Math.floor( Math.random() * chars.length ) ); }; return result; }; }; checkUploadSpeed( 10, function ( speed, average ) { document.getElementById( 'speed' ).textContent = 'speed: ' + speed + 'kbs'; document.getElementById( 'average' ).textContent = 'average: ' + average + 'kbs'; } );
<div id="speed">speed: 0kbs</div> <div id="average">average: 0kbs</div>
的jsfiddle
在演示托管的jsfiddle服务器慢。
单击此按钮去拨弄:
Answer 2:
可以使一个异步Ajax请求,它发送/返回大量的数据的服务,并且测量所花费的客户端来加载时间。 当然,这是由客户当前的网络使用状况的影响。
Answer 3:
要做到这一点,想到的一个方法是创建一个iframe
有一个form
与textarea
在里面,填补textarea
有大量的随机字符,然后以编程方式提交表单。 有提交响应召唤出父窗口说何时完成,并从提交测量完成时间。 你可能会以相对较小的有效载荷开始(所以它不会永远走在一个缓慢的连接),如果该回来得很快,日益庞大的有效载荷重复,直到你满意的结果。 在同样的事情可以使用Ajax来完成,我想,不知道为什么,我在一个方面马上想到iframe
。 见我对方的回答在这里对堆栈溢出,但认为在越来越大的表格数据,而不是下载数据的条款。
这会给你上传速度的一个非常粗略的测量。