繁体   English   中英

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

[英]How to send multipart/form-data to ASP.NET Core Web API?

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

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

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

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

还有我的 model:

    [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)

该方法运行,但信息 object 上的属性为空:(

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

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

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

[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; }

1-发送多部分文件

            [HttpPost, Route("postimagenews")]
            public IActionResult PostImageNews([FromForm] IFormFile file)
            {
                try
                {
                    if (file == null || file.Length == 0)
                    {
                        return BadRequest("Please send a photo");
                    }
                    //create unique name for file
                    var fileName = Guid.NewGuid().ToString() + Path.GetExtension(file.FileName);
    
                    //set file url
                    var savePath = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot/images/news", fileName);
    
                    using (var stream = new FileStream(savePath, FileMode.Create))
                    {
                        file.CopyTo(stream);
                    }
    
                    return Ok(fileName);
                }
                catch
                {
                    return BadRequest("error in upload image");
                }
            }

2-接收多部分文件

            public static async Task<string> PostImage(string apiendpoint, IFormFile data)
            {
                using (var httpClient = new HttpClient())
                {
                    var multipartContent = new MultipartFormDataContent();
                    var fileContent = new ByteArrayContent(GetFileArray(data));
                    fileContent.Headers.ContentType = MediaTypeHeaderValue.Parse("image/jpeg");
                    multipartContent.Add(fileContent, "file",data.FileName);
                    var resultUploadImage= await httpClient.PostAsync(apiendpoint, multipartContent);
                    if (resultUploadImage.IsSuccessStatusCode)
                    {
                        var fileName=(await resultUploadImage.Content.ReadAsStringAsync()).Replace("\"", "");
                        return fileName;
                    }
                    return "";
                }
            }
    
            public static byte[] GetFileArray(IFormFile file)
            {
                using (var ms = new MemoryStream())
                {
                    file.CopyTo(ms);
                    return ms.ToArray();
                }
            }

3-发送文件多部分与 postman

在此处输入图像描述

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

控制器:

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

在你的模型中:

public IFormFile File { get; set; }

如果不需要,请更改async Task<IActionResult> ...

也许您应该尝试使用application/x-www-form-urlencoded而不是multipart/form-data

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM