.NET6下ASP.NET Core文件上传异常:Request.Body含多余EF BF BD字节致文件损坏
二进制文件上传出现EF BF BD额外字节的问题分析
问题本质
EF BF BD是UTF-8编码的替换字符(U+FFFD),当程序尝试将不符合UTF-8规则的字节序列解码为文本时,就会生成该字符。你的情况是Request.Body被当成UTF-8文本流处理,而非原始二进制流,导致原始二进制中无法被UTF-8识别的字节被替换成了EF BF BD。
核心原因
- 请求Content-Type设置错误:如果请求的Content-Type是
text/*或未明确设置为二进制类型(如application/octet-stream),ASP.NET Core的中间件会默认将请求体按UTF-8文本解析,自动替换非法字节。 - 请求体被提前解码:某些中间件(比如日志、模型绑定中间件)可能会提前读取并解码
Request.Body,导致后续读取的流已经是经过文本处理后的内容。
解决方法
- 修正请求Content-Type:客户端上传时,必须将请求的Content-Type设置为
application/octet-stream(通用二进制类型)或对应文件的具体MIME类型(如image/jpeg、application/pdf),明确告诉服务器这是二进制数据。 - 直接操作原始二进制流:确保读取
Request.Body时不经过任何文本转换步骤,你的await Request.Body.CopyToAsync(stream)代码本身是正确的,但需要保证Body未被提前解码。可以在控制器方法开头添加:
强制ASP.NET Core将当前请求体视为二进制流。Request.ContentType = "application/octet-stream"; - 使用IFormFile处理表单上传:如果是通过表单(
multipart/form-data)上传文件,不要直接读取Request.Body,改用ASP.NET Core提供的IFormFile接口,它会自动处理文件流的解析,避免编码问题:[HttpPost("upload")] public async Task<IActionResult> UploadFile(IFormFile file) { if (file == null || file.Length == 0) return BadRequest("无效的文件"); var savePath = Path.Combine("服务器文件夹路径", file.FileName); using var fileStream = new FileStream(savePath, FileMode.Create); await file.CopyToAsync(fileStream); return Ok("文件保存成功"); }
内容的提问来源于stack exchange,提问作者zukimo
相关产品推荐
相关产品推荐

