wrapRequest()MultiPartRequest.isMultiPart(request),是則包裝為MultiPartRequestWrapperwebwork.multipart.parser屬性(預設Pell、可選Cos、Jakarta),透過反射實例化對應ParserDiskFileUpload,setSizeThreshold(0)強制所有項目(含表單欄位)寫入臨時檔案upload_XXXXXX.tmp上傳完成於wrapRequest()階段,Action執行時臨時檔案已存在。檔名為系統產生亂碼(upload_00000017.tmp),難以追蹤對應關係,無法實作上傳進度條。
流程:Request InputStream → 臨時檔案 → 目標路徑。WebWork先將完整請求寫入臨時檔,開發者再從wrapper.getFiles("fieldName")取得File物件搬移。大檔案場景下I/O開銷加倍。
非上傳欄位的臨時檔會被刪除,但時機不定(有時極早、有時極晚、甚至不刪),推測有Daemon執行緒定期掃描,開發者無法精確控制。
// 在Action或Interceptor中
MultiPartRequestWrapper wrapper = (MultiPartRequestWrapper) request;
File[] uploaded = wrapper.getFiles("doc"); // 取得臨時檔案陣列
File target = new File("/target/path/" + wrapper.getFileNames("doc")[0]);
FileUtils.copyFile(uploaded[0], target); // 自行搬移/處理
MultiPartRequest實作流式處理,避免全量寫臨時檔webwork.multipart.maxSize並監控磁碟空間saveDir殘留臨時檔,防止磁碟爆滿