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

.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。

核心原因

  1. 请求Content-Type设置错误:如果请求的Content-Type是text/*或未明确设置为二进制类型(如application/octet-stream),ASP.NET Core的中间件会默认将请求体按UTF-8文本解析,自动替换非法字节。
  2. 请求体被提前解码:某些中间件(比如日志、模型绑定中间件)可能会提前读取并解码Request.Body,导致后续读取的流已经是经过文本处理后的内容。

解决方法

  • 修正请求Content-Type:客户端上传时,必须将请求的Content-Type设置为application/octet-stream(通用二进制类型)或对应文件的具体MIME类型(如image/jpeg、application/pdf),明确告诉服务器这是二进制数据。
  • 直接操作原始二进制流:确保读取Request.Body时不经过任何文本转换步骤,你的await Request.Body.CopyToAsync(stream)代码本身是正确的,但需要保证Body未被提前解码。可以在控制器方法开头添加:
    Request.ContentType = "application/octet-stream";
    
    强制ASP.NET Core将当前请求体视为二进制流。
  • 使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 15:43:15