如何将 multipart/form-data 发送到 ASP.NET Core Web API?

Posted

技术标签:

【中文标题】如何将 multipart/form-data 发送到 ASP.NET Core Web API?【英文标题】:How to send multipart/form-data to ASP.NET Core Web API? 【发布时间】:2019-06-22 00:03:03 【问题描述】:

我正在尝试将图像和文本字段发送到 API 端点,但我收到了

不支持的内容类型'multipart/form-data; 边界=----------------------------81801171514357

这是一个 ASP.NET Core 2.1 Web API。我有这个:

[HttpPost("/api/account"), Authorize]
public void SaveUser(UserModel info)

还有我的模特:

    [JsonProperty(PropertyName = "avatar")]
    [DataType(DataType.Upload)]
    public IFormFile Avatar  get; set; 

    [JsonProperty(PropertyName = "name")]
    [DataType(DataType.Text)]
    public string Name  get; set; 

那我用axios:

    var formData = new FormData();
    formData.append("avatar", imageFile);
    formData.append("name", name);
    axios.post("/api/account", formData);

我希望这个方法能够运行,而不是抛出异常。但是怎么做?我已经尝试添加:

[Consumes("application/json", "multipart/form-data")]

但没有成功。

然后我尝试了:

[HttpPost("/api/account"), Authorize]
public void SaveUser([FromForm]UserModel info)

方法运行,但 info 对象的属性为空:(

更新: 解决方案,不要使用 JsonProperty PropertyName。使用变量名。

【问题讨论】:

上传详细文件时应使用public void SaveUser(IFormCollection collection)。关注这个***.com/questions/53825794/… 是否有任何演示可以重现您的问题?我用你当前的代码做了一个测试,它工作正常。 我还有一个方法:[HttpPost("/api/avatar"), Authorize] public void SaveAvatar(IFormFile avatar) 没有问题。但是当我在模型中添加 IFormFile 和属性时,我得到“不支持的内容类型'multipart/form-data”。 现在,我发现我不能使用 JsonProperty 名称,我必须使用 Avatar 和 Name(属性名称)。然后它工作正常。可以设置属性的名称吗? 这就是解决方案。[***.com/questions/60275185/… 【参考方案1】:

这是您正在寻找的工作示例

控制器:

[HttpPost]
public async Task<IActionResult> SaveFile([FromForm] IFormFile file) 
  // Your code here

在你的模型内部:

public IFormFile File  get; set; 

如果您不需要,请更改async Task&lt;IActionResult&gt;...

【讨论】:

【参考方案2】:

也许您应该尝试使用[FromForm] 属性装饰控制器输入和模型? 在此处查看更多信息:web api parameters binding。

在给定的示例中,您的控制器操作应如下所示:

[HttpPost("/api/account"), Authorize]
public void SaveUser([FromForm]UserModel info)

在模型中:

[FromForm(Name="avatar")]
public IFormFile Avatar  get; set; 

[FromForm(Name="name")]
public string Name  get; set; 

【讨论】:

是的,我尝试添加,[FromForm] 那么我模型中的所有属性都是空的。 尝试在模型属性上添加这个属性。 我发现我不能使用 JsonProperty 名称,我必须使用 Avatar 和 Name(属性名称)。然后它工作正常。可以设置属性的名称吗? 使用应该在控制器动作和模型定义中使用 [FromForm] 属性。至少这对我有用。 这救了我的命!我为这个问题彻夜未眠。非常感谢@joostas

以上是关于如何将 multipart/form-data 发送到 ASP.NET Core Web API?的主要内容,如果未能解决你的问题,请参考以下文章

.Net MVC 如何将 multipart/form-data 提交到 Web Api

表单的enctype="multipart/form-data"

关于Content-Type: multipart/form-data的支持

为啥上传文件要使用multipart/form-data

如何使用HTTP POST multipart / form-data将文件上传到服务器?

如何使用socket.io发送multipart / form-data?