Java文件上传下载核心是HTTP数据流处理、路径管理与安全控制;Spring Boot提供便捷支持但需理解底层逻辑,上传需校验文件名、大小并重命名,下载需正确设置响应头并流式传输。
Java中实现文件上传与下载,核心在于正确处理HTTP协议的数据流、合理管理文件存储路径、兼顾安全性与用户体验。Spring Boot生态提供了成熟便捷的支持,无需从零封装Servlet,但需理解底层逻辑才能规避常见坑点。
前端使用配合enctype="multipart/form-data"提交;后端用@RequestParam("file") MultipartFile file接收。关键注意三点:
spring.servlet.multipart.max-file-size等参数是否满足业务需求)../、替换\为/,或直接使用UUID重命名)file.isEmpty()和file.getSize(),防止空文件或超大文件写入磁盘示例保存逻辑:
String uploadDir = "/opt/uploads/"; Files.createDirectories(Paths.get(uploadDir)); String safeFilename = UUID.randomUUID() + "_" + file.getOriginalFilename(); Path targetPath = Paths.get(uploadDir, safeFilename); file.transferTo(targetPath);
下载本质是构造正确的HTTP响应头,再将文件字节写入HttpServletResponse.getOutputStream()。重点如下:
Content-Type为application/octet-stream(通用二进制)或根据扩展名动态推断(如image/png)Content-Disposition声明附件及文件名,中文名需用URLEncoder.encode(filename, "UTF-8")并加filename*=UTF-8''...格式兼容浏览器
Content-Length和Accept-Ranges: bytes以支持断点续传(尤其大文件)小文件可直接读入内存返回;大文件务必用Files.copy(path, response.getOutputStream())流式传输,避免OOM。
单机文件系统仅适用于原型或低并发场景。上
线前应考虑:
FileStorageService接口屏蔽差异XMLHttpRequest.upload.onprogress,后端通过StreamingResponseBody或WebSocket推送状态ScheduledExecutorService)本地调试正常,上线后出问题?常因以下原因:
-Dfile.encoding=UTF-8
/opt/uploads映射到宿主机或网络存储client_max_body_size 10M),需同步调大javax.servlet,若用传统Filter做上传拦截,需切换为jakarta.servlet包不复杂但容易忽略,上线前逐项核对更稳妥。