【问题标题】:How to send multipart/form-data to ASP.NET Core Web API?如何将 multipart/form-data 发送到 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)。关注这个stackoverflow.com/questions/53825794/…
  • 是否有任何演示可以重现您的问题?我用你当前的代码做了一个测试,它工作正常。
  • 我还有一个方法:[HttpPost("/api/avatar"), Authorize] public void SaveAvatar(IFormFile avatar) 没有问题。但是当我在模型中添加 IFormFile 和属性时,我得到“不支持的内容类型'multipart/form-data”。
  • 现在,我发现我不能使用 JsonProperty 名称,我必须使用 Avatar 和 Name(属性名称)。然后它工作正常。可以设置属性的名称吗?
  • 这就是解决方案。[stackoverflow.com/questions/60275185/…

标签: c# asp.net asp.net-core asp.net-core-webapi


【解决方案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
    猜你喜欢
    • 1970-01-01
    • 2019-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-14
    • 1970-01-01
    • 2019-01-06
    相关资源
    最近更新 更多