同一 WAR 包,原機運行正常,遷移到新機器部署後文件上傳失敗(Excel/JPG 均不可用),但數據庫交互、Excel 導出正常。典型的「環境差異導致文件 IO 失敗」場景。
// 錯誤:硬編碼絕對路徑
String uploadPath = "D:/uploads/";
// 正確:動態獲取項目部署路徑
String uploadPath = request.getServletContext().getRealPath("/uploads/");
// 或從配置文件讀取,支持環境變量覆蓋
String uploadPath = System.getProperty("app.upload.dir", "/opt/app/uploads");
新機器盤符、目錄結構大概率不同,硬編碼必死。mkdir -p /opt/app/uploads && chown tomcat:tomcat /opt/app/uploadscatch (Exception e) { } 空捕獲,導致前端無提示、日誌無記錄。立即補全異常日誌:
try {
file.transferTo(new File(uploadPath, filename));
} catch (IOException e) {
log.error("文件上傳失敗: path={}, file={}", uploadPath, filename, e);
throw new BusinessException("上傳失敗: " + e.getMessage());
}
webapps/項目名/WEB-INF/classes 下直接修改類文件加日誌(或熱部署 JRebel),實時觀察控制台輸出。TestUpload.jsp 只做上傳測試,隔離業務邏輯干擾。catalina.out / localhost.yyyy-mm-dd.log 是否有 Permission denied、No space left、Invalid path 等明確錯誤。@MultipartConfig)df -h / 磁盤管理器)核心原則:異常不為空、路徑配置化、權限顯式授予,遷移必須成功。