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