You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

ASP.NET Core通过REST上传文件:二进制请求及FromBody无数据问题咨询

关于二进制文件上传与[FromForm]/[FromBody]的问题解答

一、二进制模式下如何获取上传的文件数据

当你用二进制模式发送请求时(请求体直接是文件的字节内容,Content-Type通常为application/octet-stream),[FromForm]就不适用了——因为这种请求没有表单字段的包装,ASP.NET Core没法通过表单字段找到对应的IFormFile参数。这时候你需要直接读取请求体的内容:

public async Task<IActionResult> Post()
{
    // 将请求体内容读取到内存流中
    using var memoryStream = new MemoryStream();
    await Request.Body.CopyToAsync(memoryStream);
    memoryStream.Position = 0; // 重置流指针到起始位置

    // 二进制请求本身不携带文件名,你可以通过自定义请求头来传递
    var fileName = Request.Headers.TryGetValue("X-File-Name", out var headerValue)
        ? headerValue.FirstOrDefault()
        : "default-filename.bin";

    // 示例:将文件保存到本地
    var savePath = Path.Combine("your-upload-folder", fileName);
    using var fileStream = new FileStream(savePath, FileMode.Create);
    await memoryStream.CopyToAsync(fileStream);

    return Ok(new { Status = "Success", SavedFileName = fileName });
}

测试的时候注意:

  • 在Insomnia/Postman中选择「Binary」模式,上传你的文件
  • 设置请求头Content-Typeapplication/octet-stream
  • 如果需要传递文件名,添加自定义请求头(比如X-File-Name: my-file.jpg

二、为什么把[FromForm]改成[FromBody]无法获取数据

这是因为[FromBody][FromForm]的设计场景完全不同:

  • [FromForm]是专门用来解析multipart/form-data格式的请求——这种请求会用边界分隔表单字段,ASP.NET Core能识别其中的文件字段并封装成IFormFile对象。
  • [FromBody]则是用来解析结构化的序列化数据(比如JSON、XML),它会尝试把请求体的内容反序列化成你指定的参数类型。但IFormFile是为表单文件设计的类型,既不是JSON也不是XML结构,所以[FromBody]根本无法解析请求体中的文件内容,自然获取不到数据。

简单说:IFormFile只和multipart/form-data请求配对,二进制请求和[FromBody]都不兼容它。

内容的提问来源于stack exchange,提问作者Thomas

火山引擎 最新活动