// Spring MVC 控制器示例
@PostMapping("/upload")
public String upload(@RequestParam("file") MultipartFile file, RedirectAttributes ra) {
if (file.isEmpty()) return "error";
try {
String destPath = "/data/uploads/" + file.getOriginalFilename();
File destFile = new File(destPath);
// 確保父目錄存在
destFile.getParentFile().mkdirs();
// 核心:一行代碼完成複製
FileUtils.copyFile(file.getInputStream(), destFile); // 或 copyInputStreamToFile
ra.addFlashAttribute("msg", "上傳成功:" + destPath);
} catch (IOException e) {
log.error("複製失敗", e);
ra.addFlashAttribute("msg", "上傳失敗:" + e.getMessage());
}
return "redirect:/list";
}
MultipartFile.transferTo(destFile) 更高效(底層可能用 FileChannel.transferTo 零拷貝),但要求目標文件系統支持;FileUtils.copyFile 通用性更強。spring.servlet.multipart.max-file-size、max-request-size。<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.11.0</version>
</dependency>
若需解壓 ZIP 內容而非整包存儲,使用 ZipInputStream 遍歷條目寫入目標目錄,或引入 zeroturnaround/zt-zip 簡化 API。