Servlet 使用 Apache Commons FileUpload 上傳文件,當前代碼硬編碼保存路徑 C:\\upload_test,需改為動態獲取 Web 應用根目錄下的 upload 文件夾。
// 原代碼
File saved = new File("C:\\upload_test", fileName);
// 修正後
String filePath = getServletContext().getRealPath("/") + "upload" + File.separator;
File uploadDir = new File(filePath);
if (!uploadDir.exists()) uploadDir.mkdirs();
File saved = new File(uploadDir, fileName);
getServletContext().getRealPath("/") 返回 Web 應用在服務器文件系統上的絕對路徑(如 /var/lib/tomcat/webapps/myapp/ 或 C:\Tomcat\webapps\myapp\)。upload 目錄,使用 File.separator 保證跨平台兼容。mkdirs() 創建。web.xml context-param 或外部配置文件,避免硬編碼。protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
ServletFileUpload upload = new ServletFileUpload(new DiskFileItemFactory());
List items = upload.parseRequest(request);
String basePath = getServletContext().getRealPath("/") + "upload" + File.separator;
File baseDir = new File(basePath);
if (!baseDir.exists()) baseDir.mkdirs();
for (FileItem item : items) {
if (!item.isFormField()) {
String fileName = new File(item.getName()).getName(); // 防止路徑遍歷
File saved = new File(baseDir, fileName);
try (InputStream in = item.getInputStream();
FileOutputStream out = new FileOutputStream(saved)) {
byte[] buffer = new byte[1024];
int len;
while ((len = in.read(buffer)) > 0) out.write(buffer, 0, len);
}
response.getWriter().println("已保存:" + saved.getAbsolutePath());
}
}
}
location /upload { deny all; } 或 IIS 移除執行權限)。