Java文件上传下载核心是处理HTTP二进制流并正确设置响应头与I/O操作;上传用MultipartFile接收multipart/form-data请求,下载通过设置Content-Disposition和Content-Type返回文件流。

Java 中实现文件上传下载功能,核心在于处理 HTTP 请求中的二进制数据流,并正确设置响应头、读写文件 I/O。常用方式是结合 Web 框架(如 Spring Boot)完成,底层依赖 Servlet API 或第三方库(如 Apache Commons FileUpload),但现代开发中推荐使用 Spring MVC 的内置支持。
文件上传:接收前端传来的 multipart/form-data
前端需用 <form enctype="multipart/form-data"> 提交,后端用 @RequestParam("file") MultipartFile file 接收。
- 检查文件是否为空:
if (file.isEmpty()) { ... } - 获取原始文件名:
file.getOriginalFilename()(注意防范路径遍历,如过滤../) - 保存到服务器磁盘:
file.transferTo(new File(uploadPath + fileName)),或用Files.copy(file.getInputStream(), path) - 建议设置单文件大小限制(如
spring.servlet.multipart.max-file-size=10MB)
文件下载:返回文件流并设置响应头
下载本质是把文件内容写入 HTTP 响应体,并告知浏览器以附件形式打开。
- 通过
Resource或FileInputStream获取文件输入流 - 设置响应头:
response.setHeader("Content-Disposition", "attachment; filename=\"" + URLEncoder.encode(fileName, "UTF-8") + "\""); - 设置 Content-Type:
response.setContentType("application/octet-stream");(通用二进制类型)或根据扩展名动态推断(如Files.probeContentType(path)) - 用
IOUtils.copy(inputStream, response.getOutputStream())或Files.copy(path, response.getOutputStream())输出
大文件上传下载的注意事项
避免内存溢出和超时,尤其在上传大文件或并发高时:
立即学习“Java免费学习笔记(深入)”;
- 上传:禁用内存缓存(
spring.servlet.multipart.resolve-lazily=true),改用临时磁盘存储 - 下载:使用
StreamingResponseBody或分块传输(RandomAccessFile+response.getOutputStream().write(buffer)) - 加超时配置:
server.tomcat.connection-timeout=60000,或用 Nginx 反向代理时同步调大client_max_body_size和proxy_read_timeout
安全与健壮性补充
生产环境必须考虑基础防护:
- 校验文件扩展名和 MIME 类型(不能只信后缀,要用
Files.probeContentType()或 Tika 库) - 限制上传目录权限,避免写入 WebRoot 或系统路径
- 下载时验证文件路径是否在允许范围内(如白名单目录),防止任意文件读取
- 记录上传/下载日志,包括用户、时间、文件名、大小、结果状态


















