2010-06-28 68 views
0

我使用FileReference類的upload()方法上傳文件。我想要顯示當前的連接速度,我想知道什麼是一種很好的方法。AS3:計算當前上傳速度(或吞吐量)

我的當前技術是使用一個定時器,每1毫秒,例如如下:

var speed:Function = function(event:TimerEvent):void { 
    speed = Math.round((currentBytes - lastBytes)/1024); 
    lastBytes = currentBytes; 
} 
var speedTimer:Timer = new Timer(1000); 
speedTimer.addEventListener(TimerEvent.TIMER, uploadSpeed); 

和currentBytes獲取設置到使用ProgressEvent.PROGRESS。這種技術似乎不夠精確。我想知道我可以使用其他方式來實時上傳和顯示上傳速度。

任何想法或意見,歡迎!

非常感謝你,

魯迪

回答

0

如果代碼塊是副本,並將其粘貼當然因爲你已經預料到將無法正常工作。您聲明speed是一種函數,您似乎將其重新定義爲一個數字。我很欣賞Flash IDE,讓你用粗略的語法逃脫,但是像這樣的代碼會導致你陷入各種麻煩。在編寫代碼時儘量明確。

嘗試這樣的事情,跟你分配給上傳任何標識更換yourLoader

private var speed:Number = 0; 
private var lastBytes:uint = 0; 

private function uploadSpeed(event:TimerEvent):void 
{ 
    speed = Math.round((yourLoader.currentBytes - lastBytes)/1024); 
    lastBytes = yourLoader.currentBytes; 
} 

private var speedTimer:Timer = new Timer(1000); 
speedTimer.addEventListener(TimerEvent.TIMER, uploadSpeed); 

這應該算多少字節在1秒間隔如何移動。

編輯:

你可能想使間隔小於1000毫秒小一點,爲了你最後ň樣本計算的平均速度。這會讓用戶看到的號碼看起來比現在更穩定。使速度成爲Array.push()的最新樣本。使用.shift()刪除最古老的樣本,以免失去太多準確性。反覆試驗會讓您更清楚地瞭解需要保存多少個樣本以及多長時間一次。

+0

這不是每行復制和粘貼的行,我嘗試在此處快速重寫它,並將名稱「speed」設置爲兩次。在我的程序中並不是這樣,但是很好,謝謝。 我喜歡數組的想法,並推動元素,只是計算n個樣本中的平均值。它會使它更穩定(雖然突然下降或速度增加需要一些時間來反映),但它仍然是一個更好的解決方案。謝謝! – Rudy 2010-06-29 16:26:15

0

可以箴言報在服務器上上傳速度,然後發送數據返回給客戶端。這種技術通常用於ajax文件上傳表單。

+0

好的,謝謝。如果我只需要使用客戶端,請問客戶端有沒有什麼好方法? – Rudy 2010-06-28 22:21:01