C#怎么实现文件上传下载 C#如何用WebAPI实现大文件断点续传功能【网络】

张开发
2026/4/20 4:01:16 15 分钟阅读

分享文章

C#怎么实现文件上传下载 C#如何用WebAPI实现大文件断点续传功能【网络】
ASP.NET Core 上传大文件需同时配置 IIS 最大请求体和控制器级 RequestSizeLimit断点续传依赖服务端维护已上传字节数并校验唯一 ID下载须流式处理避免内存溢出合并分块需按序拼接并保证原子性。WebAPI 上传大文件时 IFormFile 直接报错或截断ASP.NET Core 默认限制单个请求体大小为 30MB超过就直接 400 或连接重置根本进不到控制器逻辑。不是代码写错了是管道在模型绑定前就拦下了。必须同时改两处配置Startup.cs.NET 5 在 Program.cs里加 ConfigureServices 配置services.ConfigureIISOptions(options options.MaxRequestBodySize null);仅 IIS全局或控制器级加 [RequestSizeLimit(200_000_000)] 或更宽松的值单位字节且需确保中间件顺序在 UseRouting 之后、UseEndpoints 之前前端 fetch 或 axios 发送时别用 FormData 拼错字段名——后端 [FromForm] IFormFile file 绑定的字段名必须和表单中 append(file, blob) 的第一个参数完全一致断点续传核心怎么判断文件块是否已存在并跳过关键不在“传”而在“查”。每次上传前客户端必须先发一个 HEAD 或 GET 请求带 Range 和文件唯一标识如 Content-MD5 或自定义 X-Upload-ID服务端根据这个 ID 查本地临时目录或数据库返回已接收的字节数206 Partial Content Content-Range或 200 OK 表示全新上传。不要依赖客户端传来的“当前 offset”它可能伪造或错位服务端必须自己维护每个 X-Upload-ID 对应的已写入长度用 ConcurrentDictionarystring, long 存 ID → 已写大小开发期够用生产建议换 Redis写文件时用 FileStream 构造函数指定 FileMode.Append但注意必须先 Seek 到指定位置再写否则会追加在末尾破坏分块顺序客户端收到 206 后从 Content-Range 解析出 bytes 0-1048575/2097152 中的 1048576作为下一块的起始偏移HttpClient 下载大文件卡死或内存爆掉别用 response.Content.ReadAsStringAsync() 或 ReadAsByteArrayAsync()——这是把整个文件读进内存1GB 文件直接 OOM。下载必须流式处理。正确做法是拿到 HttpContent.ReadAsStreamAsync() 后用 Stream.CopyToAsync() 直接写入本地文件流 JoinMC智能客服 JoinMC智能客服帮您熬夜加班7X24小时全天候智能回复用户消息自动维护媒体主页全平台渠道集成管理电商物流平台一键绑定让您出海轻松无忧

更多文章