在 Web 開發中,提供文件上傳進度條能大幅提升用戶體驗。本文介紹如何利用 Apache Commons FileUpload 元件的 ProgressListener 介面,結合 Session 機制,實現即時顯示上傳進度的功能,並提供完整的 Demo 原始碼供下載參考。
Commons FileUpload 提供了 ProgressListener 介面,其 update(long pBytesRead, long pContentLength, int pItems) 方法會在讀取上傳數據時被反覆呼叫。我們只需實作此介面,將已讀取位元組數(pBytesRead)、總大小(pContentLength)等資訊存入 Session,前端即可透過輪詢另一個 Servlet 取得進度並更新進度條。
package lc.progress;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import lc.progress.vo.FileUploadStatus;
import org.apache.commons.fileupload.ProgressListener;
public class MyProgressListener implements ProgressListener {
private HttpSession session;
public MyProgressListener(HttpServletRequest req) {
this.session = req.getSession();
FileUploadStatus status = new FileUploadStatus();
session.setAttribute("status", status);
}
@Override
public void update(long pBytesRead, long pContentLength, int pItems) {
FileUploadStatus status = (FileUploadStatus) session.getAttribute("status");
status.setBytesRead(pBytesRead);
status.setContentLength(pContentLength);
status.setItems(pItems);
}
}
MyProgressListener listener = new MyProgressListener(request);
ServletFileUpload upload = new ServletFileUpload(factory);
upload.setProgressListener(listener);
前端使用 JavaScript 定時請求一個專門的 Servlet,從 Session 中讀取 FileUploadStatus 物件,計算百分比並更新頁面進度條。完整前端邏輯請參考下載的 Demo 原始碼。
此方案架構清晰:後端負責記錄進度狀態,前端負責展示。適用於中小型文件上傳場景。完整專案結構與配置請下載文末附件的原始碼進行研究。
Demo 原始碼下載: 點此下載完整範例專案