舊系統大量使用 SmartUpload 處理檔案上傳,但其單檔限制約 10 MB,無法滿足新需求(≥50 MB)。全量替換為 Apache Commons FileUpload 需修改 50 處代碼,風險極高。採用適配器模式,編寫同名類 SmartUpload 封裝 FileUpload 核心,實現「零業務代碼修改」平滑遷移。
SmartUpload objUpload = new SmartUpload(pageContext);
if (objUpload.getCount() > 0) {
for (int i = 1; i <= objUpload.getCount(); i++) {
ps.setString(9, objUpload.getUgetContentType(i));
ps.setString(10, objUpload.getUFileName(i));
ps.setBinaryStream(11, objUpload.getUFileInputStream(i), objUpload.getFLength(i));
}
}
gui 包,類名仍為 SmartUpload,ClassLoader 優先加載,原有 import 無需變動。filesize 參數控制上限(預設 100 MB)。Hashtable<String, FileItem> files 按序號索引上傳檔案;Hashtable<String, Hashtable> parameters 存儲普通表單欄位,支援同名多值。pageinit()DiskFileItemFactory factory = new DiskFileItemFactory();
factory.setSizeThreshold(4096); // 4 KB 閾值,超過寫臨時檔
ServletFileUpload upload = new ServletFileUpload(factory);
upload.setHeaderEncoding(this.pencoding);
upload.setFileSizeMax(this.filemaxsize); // 單檔大小限制
List<FileItem> items = upload.parseRequest(request);
for (FileItem item : items) {
if (item.isFormField()) {
// 普通欄位存入 parameters
} else if (item.getSize() > 0) { // 過濾空檔案欄位
if (item.getSize() > filemaxsize) { maxflag = 1; }
files.put(String.valueOf(++filecount), item);
}
}
| 原 SmartUpload 方法 | 適配器實現 |
|---|---|
getCount() | files.size() |
getUFileName(i) | item.getName().substring(lastIndexOf('\\')+1) |
getUgetContentType(i) | item.getContentType() |
getUFileInputStream(i) | item.getInputStream() |
getFLength(i) | (int) item.getSize() |
getParameter(name) | 從 parameters 取值並做 ISO-8859-1 → 指定編碼轉換 |
commons-fileupload、commons-io 依賴。repository 指定專用目錄。clean() 方法預留資源釋放邏輯,FileUpload 會自動清理臨時檔,通常無需額外代碼。