.NET大文件分片上传:控制器无法获取分片索引与总数
分片上传参数获取问题的解决方案
问题根源
- 前端手动设置
Content-Type: multipart/form-data,但FormData提交时浏览器会自动生成包含boundary的正确请求头,手动设置会丢失boundary,导致后端无法解析表单参数。 - 后端未明确指定参数来源,且直接读取
Request.Body会与表单参数绑定冲突,导致参数无法正确获取。
修改步骤
前端代码调整
移除手动设置Content-Type的代码,让浏览器自动处理请求头:
function upload(file) { var blob = file; var BYTES_PER_CHUNK = 775700; var SIZE = file.size; var start = 0; var end = BYTES_PER_CHUNK; var count = SIZE % BYTES_PER_CHUNK == 0 ? SIZE / BYTES_PER_CHUNK : Math.floor(SIZE / BYTES_PER_CHUNK) + 1; var index = 1; while (start < SIZE) { var chunk = blob.slice(start, end); var data = new FormData(); data.append("TOTAL_CHUNK", count); data.append("CHUNK_INDEX", index++); data.append("CHUNK", chunk); var xhr = new XMLHttpRequest(); xhr.open("POST", "UploadChunks", true); // 移除手动设置Content-Type的行 xhr.send(data); start = end; end = start + BYTES_PER_CHUNK; } }
后端代码调整
- 用
[FromForm]标记参数,明确从表单数据中绑定 - 改用
IFormFile接收分片文件,避免流读取与参数绑定冲突 - 添加临时目录存在性检查
[HttpPost] public string UploadChunks([FromForm]int CHUNK_INDEX, [FromForm]int TOTAL_CHUNK, [FromForm]IFormFile CHUNK) { string path = Path.Combine(_hostEnvironment.WebRootPath, @"file\temp"); // 确保临时目录存在 if (!Directory.Exists(path)) { Directory.CreateDirectory(path); } string newpath = Path.Combine(path, $"{Guid.NewGuid()}.tmp{CHUNK_INDEX}"); using (var fs = System.IO.File.Create(newpath)) { CHUNK.CopyTo(fs); } return "success"; }
关键说明
- 浏览器自动生成的
multipart/form-data请求头包含boundary分隔符,是后端正确解析表单数据的必要条件,手动设置会破坏这一结构。 [FromForm]特性明确告知ASP.NET Core从表单数据中提取参数,避免模型绑定的歧义。- 使用
IFormFile是ASP.NET Core处理上传文件的标准方式,既简化了文件写入逻辑,又避免了直接读取Request.Body导致的参数绑定失败问题。
内容的提问来源于stack exchange,提问作者Hjal Abderrazak
相关产品推荐
相关产品推荐

