java文件上传大小校验需在写入前通过content-length、part.getsize()、multipartfile.getsize()或流式读取实现,兼顾servlet原生、spring mvc/boot及前端双重校验,确保早、准、可控。

Java 实现文件上传时的文件大小校验,核心是在文件真正写入磁盘或内存前,就通过请求元信息或流式读取判断是否超限,避免大文件占用资源。关键点在于:校验要早、要准、要可控,且需兼顾不同上传方式(如 Servlet、Spring MVC、Spring Boot)。
Servlet 原生方式:利用 Content-Length 和流预读
HTTP 请求头中的 Content-Length 字段表示整个请求体字节数,对单文件上传(如表单 enctype="multipart/form-data" 中仅一个 file 字段)可作为粗略上限参考;但注意:该值包含所有表单字段(文本+文件),不能直接等同于文件大小。
更可靠的做法是使用 Servlet 3.0+ 的 Part API,在获取文件内容前检查其 getSize():
- 调用
request.getPart("file")获取 Part 对象 - 立即调用
part.getSize()—— 此值是实际文件内容长度(单位字节),不包含边界和元数据 - 若超过阈值(如 10MB),直接返回错误响应,不调用
part.write()
示例片段:
if (part.getSize() > 10 * 1024 * 1024) {
response.sendError(HttpServletResponse.SC_BAD_REQUEST, "文件不能超过 10MB");
return;
}
Spring MVC / Spring Boot:用 @RequestParam MultipartFile + 配置校验
Spring 封装了 Part 操作,推荐使用 MultipartFile。校验分两层:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
容器级限制:在
application.properties中配置最大上传尺寸,拦截超限请求(推荐前置防御):
spring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=10MB -
代码级校验:在 Controller 方法中显式检查:
if (file.isEmpty()) { /* 处理空文件 */ }
if (file.getSize() > 10 * 1024 * 1024) {
throw new IllegalArgumentException("文件大小超出限制");
}
注意:若已配置容器级限制,超限请求根本不会到达 Controller,所以代码校验主要用于自定义逻辑(如按用户角色设不同阈值)。
流式校验(适用于大文件或自定义解析场景)
当无法依赖 getSize()(例如使用 Apache Commons FileUpload 手动解析,或处理分块上传),可边读边校验:
- 用
InputStream逐块读取(如每次 8KB) - 累计已读字节数,一旦超过阈值,立即中断读取并抛出异常
- 避免将整个文件加载进内存,防止 OOM
示例逻辑:
long total = 0;byte[] buffer = new byte[8192];
int len;
while ((len = inputStream.read(buffer)) != -1) {
total += len;
if (total > 10 * 1024 * 1024) {
throw new IOException("文件过大");
}
// 可选:写入目标流(如 FileOutputStream)
}
前端配合与用户体验
服务端校验不可替代,但前端增加校验能提升体验:
- 使用
input[type="file"].files[0].size获取客户端文件大小(单位字节) - 上传前提示“文件不能超过 10MB”,并禁用提交按钮
- 注意:JS 校验可被绕过,必须和服务端双重校验
不复杂但容易忽略:校验阈值建议统一管理(如配置文件或常量类),避免硬编码;同时记录超限日志,便于监控异常上传行为。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










