如何使用其他参数上传IFormFile

时间:2019-10-17 11:45:22

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

我有一个现有的API,该API正在从请求正文中读取数据:

[HttpPost]
public async Task<IActionResult> Post([FromBody] CreateVm vm)
{
    if (!ModelState.IsValid) return BadRequest();
    var result = await _service.CreateAsync(vm);
    return Ok(result);
}

出现了一个新要求,要求客户端要与视图模型一起提交图像。我的第一个想法是将IFormFile附加到请求,在其他服务中处理它,然后继续:

public async Task<IActionResult> Post([FromBody] CreateVm vm, IFormFile file) { /* ... */}

此方法的结果是,我得到了状态码415“不受支持的媒体类型”。

我曾尝试使用邮递员将Content-Type设置为multipart/form-data,但无济于事。

这种方法是否可行,还是需要在视图模型中添加byte[]属性并从那里解析图像?

2 个答案:

答案 0 :(得分:1)

我假设,因为这以前在上传要发送JSON的文件的新要求之前有效。 (将来,如果您还演示了如何进行请求,将会很有帮助。)

可以通过JSON“上传”文件,但是文件必须以JSON对象可以包含的格式发送,即JS int数组或Base64编码的字符串。 ASP.NET Core可以处理任何一个,并将值绑定到byte[]

没有发出请求的代码,很难为您提供更多指导,但是您基本上只需要向视图模型添加byte[]属性,然后在发出请求时,阅读文件数据,并将其作为int数组或Base64编码的字符串(对应于该属性名称)写入JSON。例如,如果您通过JavaScript发出请求,则可以使用File API在上载输入中获取文件的数据。

IFormFile仅适用于multipart/form-data编码的请求,并且使用modelbinder时不能混合和匹配请求主体编码。因此,如上所述,您必须停止使用JSON或在JSON对象中发送文件,而不是使用IFormFile

答案 1 :(得分:-1)

我认为带有[FromForm]标签的表单数据请求应该适合您。

using Microsoft.AspNetCore.Http;

public class CarModelPostDTO {
    public string Name { get; set; }
    public IFormFile Image { get; set; }
}
[HttpPost("api/car")]
public ActionResult Car([FromForm]CarModelPostDTO carDto)
{
    // Getting Name
    string name = carDto.Name;
    // Getting Image
    var image = carDto.Image;
    // Saving Image on Server
    if (image.Length > 0) {
        using (var fileStream = new FileStream(image.FileName, FileMode.Create)) {
            image.CopyTo(fileStream);
        }
    }
    return Ok(new { status = true, message = "Car created successfully"});
}

这是完整的tutorial