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-Type为application/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




