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

Angular 10中FormData同时传文件与数据报415错误的技术问询

解决Angular 10 FormData同时传文件和数据对象的415错误问题

我之前处理过类似的场景,你遇到的415 Unsupported Media错误,核心原因是后端.NET Core的模型绑定无法直接解析你通过Blob传递的JSON数据——默认情况下,它只处理FormData里的普通键值对,而不会去读取application/json类型Blob的内容。下面给你两种可行的解决方案:

方案一:将数据对象拆分为FormData的键值对(推荐)

这种方式最贴合后端默认的模型绑定逻辑,不需要修改后端代码,直接把嵌套对象和数组拆成对应的表单字段:

Angular代码修改:

var dataForm : FormData = new FormData();
// 添加文件
dataForm.append('file', <File>files[0], (<File>files[0]).name);

// 拆分嵌套对象object1为表单字段
dataForm.append('object1.Name', 'Name');
dataForm.append('object1.ID', '1');

// 处理数组Arr:重复append同一个键,后端List会自动收集所有值
dataForm.append('Arr', '1');
dataForm.append('Arr', '2');
dataForm.append('Arr', '3');

为什么这样可行?

.NET Core的模型绑定会自动识别这种嵌套字段命名格式(比如object1.Name对应RequestParams里object1的Name属性),以及重复键的数组值,直接把FormData的内容映射到RequestParams对象里,同时你依然可以通过Request.Form.Files[0]获取上传的文件。

方案二:传递JSON字符串并在后端手动解析

如果你的数据结构非常复杂,不想拆分成单个字段,可以直接把JSON字符串作为普通表单值传递,然后在后端手动反序列化:

Angular代码修改:

var dataForm : FormData = new FormData();
// 添加文件
dataForm.append('file', <File>files[0], (<File>files[0]).name);

var objectToSend : any = {};
objectToSend.object1 = { Name:'Name', ID: 1 };
objectToSend.Arr = [1,2,3];
// 直接传递JSON字符串,不要转成Blob
dataForm.append('data', JSON.stringify(objectToSend));

后端代码修改:

using System.Text.Json;

[HttpPost("uploadFile"), DisableRequestSizeLimit]
public IActionResult Upload() {
    var file = Request.Form.Files[0];
    // 读取FormData里的data字段(JSON字符串)
    var dataJson = Request.Form["data"];
    // 手动反序列化为RequestParams对象
    var param = JsonSerializer.Deserialize<RequestParams>(dataJson, new JsonSerializerOptions {
        PropertyNameCaseInsensitive = true // 兼容Angular的驼峰命名和C#的PascalCase
    });
    
    // 这里可以处理param和file
    return Ok();
}

注意点:

  • 记得开启PropertyNameCaseInsensitive,因为Angular默认用驼峰命名(比如object1),而C#类是PascalCase(比如Object1),这样反序列化才能正确匹配。
  • 这种方式需要你手动处理模型验证,如果有需要,要自己添加验证逻辑。

为什么原来的方法会报错?

你之前把JSON转成application/json类型的Blob加到FormData里,后端接收到的data字段是一个独立的文件类型项(而非普通文本),默认的模型绑定不知道要去读取这个Blob的内容并解析成RequestParams,所以抛出了415不支持媒体类型的错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 14:32:45