You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET大文件分片上传:控制器无法获取分片索引与总数

分片上传参数获取问题的解决方案

问题根源

  1. 前端手动设置Content-Type: multipart/form-data,但FormData提交时浏览器会自动生成包含boundary的正确请求头,手动设置会丢失boundary,导致后端无法解析表单参数。
  2. 后端未明确指定参数来源,且直接读取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;
    }   
}

后端代码调整

  1. 用[FromForm]标记参数,明确从表单数据中绑定
  2. 改用IFormFile接收分片文件,避免流读取与参数绑定冲突
  3. 添加临时目录存在性检查
[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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 15:55:19