1. 大文件分片上传的核心挑战与解决方案
在JavaWeb项目中实现大文件上传是个经典难题。我经历过一个医疗影像系统项目,需要处理平均500MB以上的DICOM文件,传统单次上传方式完全不可行。服务器直接报413 Request Entity Too Large错误,用户等待超时更是家常便饭。
分片上传技术将大文件切割成多个小块(通常1-5MB),通过多次HTTP请求逐步上传。这种方案有三大核心优势:
- 网络容错:单个分片失败只需重传该分片
- 断点续传:记录已上传分片信息
- 并行加速:浏览器可并发多个分片请求
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 前端分片处理实现细节
2.1 文件切片算法实现
前端采用Blob.prototype.slice方法进行文件切割,这是浏览器原生支持的二进制操作。关键代码示例:
javascript复制function createChunks(file, chunkSize) {
const chunks = []
let start = 0
while (start < file.size) {
const end = Math.min(start + chunkSize, file.size)
chunks.push(file.slice(start, end))
start = end
}
return chunks
}
实际项目中需要特别注意:
- iOS Safari对Blob.slice的兼容性问题
- 分片大小建议设置为512KB-5MB之间
- 需要生成唯一文件指纹(MD5+文件大小)
2.2 上传队列控制策略
浏览器并行请求数有限制(HTTP/1.1约6个),需要实现智能队列:
javascript复制class UploadQueue {
constructor(maxParallel = 3) {
this.pending = []
this.active = 0
this.maxParallel = maxParallel
}
add(task) {
this.pending.push(task)
this.run()
}
run() {
while (this.active < this.maxParallel && this.pending.length) {
const task = this.pending.shift()
task().finally(() => {
this.active--
this.run()
})
this.active++
}
}
}
3. 服务端Java实现方案
3.1 分片接收与临时存储
使用Spring MVC接收分片数据:
java复制@PostMapping("/upload/chunk")
public ResponseEntity<?> uploadChunk(
@RequestParam("file") MultipartFile file,
@RequestParam("chunkNumber") int chunkNumber,
@RequestParam("totalChunks") int totalChunks,
@RequestParam("identifier") String identifier) {
String tempDir
