監聽文件上傳進度
如果你希望可以上傳很大的文件,這時,你可能想將上傳的狀態告訴用戶,如已經接收了多少。
觀察上傳進度需要通過一個處理監聽器來實現。
public class UploadProgressListener implements ProgressListener {
/**
* pBytesRead,到目前為止已經讀取的字節數
* pContentLength,上傳文件的總長度
* pItems,正在處理第幾個文件項(0 = 一個項目還沒處理, 1 = 第一個項目正在被讀取, ...)
*/
public void update(long pBytesRead, long pContentLength, int pItems) {
System.out.println("我們正在讀取文件項目 " + pItems);
//pContentLength == -1,說明無法得到總數據長度
if (pContentLength == -1) {
System.out.println("到目前為止已經讀取了 " + pBytesRead + " 字節的數據。");
} else {
System.out.println("到目前為止已經讀取了" + pContentLength
+ " 中的 "+ pBytesRead + " 字節");
}
}
}
上面這個監聽器是有問題的。因為它會非常頻繁地被調用。這會帶來性能問題。一個比較好
的解決辦法是減少調用。如下代碼,為監聽器類增加一個kiloBytes實例屬性,其值默認為-1,每當
pBytesRead/1024的結果變化時(即以KB為單位增加時),將新的計算結果賦值給kiloBytes,然后
更新上傳進度信息,否則什么都不做,直接返回。這樣就可以減少信息更新的次數。如果上傳的
文件非常大時,可以將KB單位改為MB,進一步減少信息更新的次數。
public class UploadProgressListener implements ProgressListener {
private long kiloBytes = -1;
/**
* pBytesRead,到目前為止已經讀取的字節數
* pContentLength,上傳文件的總長度
* pItems,正在處理第幾個文件項(0 = 一個項目還沒處理, 1 = 第一個項目正在被讀取, ...))
*/
public void update(long pBytesRead, long pContentLength, int pItems) {
long kBytes = pBytesRead / 1024;// 取1KB
if (kiloBytes == kBytes) {
return;
}
kiloBytes = kBytes;
System.out.println("我們正在讀取文件項目 " + pItems);
//pContentLength == -1,說明無法得到總數據長度
if (pContentLength == -1) {
System.out.println("到目前為止已經讀取了 " + pBytesRead + " 字節的數據。");
} else {
System.out.println("到目前為止已經讀取了" + pContentLength
+ " 中的 "+ pBytesRead + " 字節");
}
}
}
在服務器端,我們只需設計一個對象,將進度信息封裝到這個對象中,再將該對象保存在用戶會
話中,利用上面示例代碼不斷的更新這個對象的狀態。
在客戶端,我們可以每隔n秒鐘發起一次ajax請求,到會話中獲取文件上傳進度信息,直到上傳完
畢。
鄭州蜂鳥科技有限公司 申林 QQ:38185398 鄭州軟件開發興趣小組群:38236716
學軟件開發,到蜂鳥科技!超強的師資力量 、完善的課程體系 、超低的培訓價格 、真實的企業項目。
地址:鄭州市文化路豐產路口東50米豐產路21號SOHO世紀城西塔20樓F
電話:0371-63839606 手機:13838505572(申老師) 13673990036 (許老師)
QQ: 1073422643 1群:47614738 2群:108157678
網址:www.ntcsoft.com
posted on 2010-09-03 23:59
whistler 閱讀(1599)
評論(0) 編輯 收藏