【问题标题】:How to upload an IFormFile with additional parameters如何上传带有附加参数的 IFormFile
【发布时间】:2019-10-17 11:45:22
【问题描述】:

我有一个现有的 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[] 属性并从那里解析图像?

【问题讨论】:

  • 你应该先问“如何使用相同的表单发布数据和文件”?您不能再将整个正文传递给一个参数。
  • 您的表单或邮递员帖子是什么样的?

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


【解决方案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

【讨论】:

    【解决方案2】:

    我假设因为这在上传您发送 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

    【讨论】:

    • 谢谢,关键部分是关于默认模型绑定器的部分。我采用 JSON 方法并放弃了 IFormFile,因为这是客户端当前使用它的方式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-28
    • 2012-09-21
    • 1970-01-01
    • 2018-05-24
    • 2019-02-10
    相关资源
    最近更新 更多