1. 大文件上传进度监控的痛点与解决方案
在Web应用开发中,处理大文件上传是个老生常谈却又常做常新的需求。我经历过一个医疗影像管理系统项目,需要上传平均300MB以上的DICOM文件,最初采用传统表单提交方式,用户经常抱怨:"传了半小时,最后告诉我失败了?"这种糟糕体验促使我们研究进度监控方案。
SpringMVC的拦截器机制恰好能完美解决这个问题。不同于过滤器(Filter)处理的是Servlet请求,拦截器(Interceptor)工作在更上层的Spring MVC框架中,能获取到DispatcherServlet分发后的控制器上下文信息。这让我们可以在文件上传过程中插入监控逻辑,而不会污染业务代码。
关键认知:拦截器 vs 过滤器
- 过滤器:Servlet规范定义,处理原始HTTP请求/响应
- 拦截器:Spring MVC特有,可访问HandlerMethod等Spring上下文
- 执行顺序:Filter -> DispatcherServlet -> Interceptor -> Controller
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心实现架构设计
2.1 整体流程设计
实现进度监控需要解决三个技术点:
- 前端分片上传与进度事件监听
- 服务端接收分片时的进度计算
- 前后端进度信息的实时同步
我们采用的技术组合:
- 前端:FineUploader(支持分片和进度回调)
- 传输层:Commons FileUpload + Servlet 3.0 API
- 监控层:自定义ProgressInterceptor
- 数据同步:Redis发布订阅
java复制// 架构伪代码示意
class ProgressInterceptor extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(...) {
// 初始化进度上下文
}
@Override
public void afterCompletion(...) {
// 清理进度数据
}
}
class UploadController {
@PostMapping("/upload")
public void chunkUpload(
@RequestParam("file") MultipartFile chunk,
HttpSession session) {
// 处理分片并更新进度
}
}
2.2 进度计算数学模型
假设一个500MB文件,分片大小为5MB,则:
- 总分片数 = ceil(500 / 5) = 100片
- 每片进度贡献 = 1 / 100 = 1%
- 已上传进度 = min(100%, 当前片数 * 1% + 当前片内进度)
这个模型需要在拦截器中实时维护:
java复制class UploadProgress {
private long totalSize;
private long uploaded;
private int currentChunk;
private int totalChunks;
public double getPercent() {
double chunkProgress = (currentChunk - 1) * 100.0 / totalChunks;
double currentChunkProgress = uploaded * 100.0 / (totalSize / totalChunks);
