在 .NET Core Web API 中使用 multipart/form-data 媒体类型上传多个文件时出现意外行为?

Unexpected behaviour when uploading multiple files using multipart/form-data media type in .NET Core Web API?

我在我的项目中使用 .NET core 3.1,我需要上传多个文件。下面是我的模型:

public class ProductImageDetailsDto
{
    [Display(Name = "product image")]
    [AllowedExtensions(new string[] { ".jpg", ".png" })]
    public IFormFile ProductImage { get; set; }
}

下面是我的网站API,其中我接受List<ProductImageDetailsDto>作为参数:

    [HttpPut("UpdateProductImagesByProductId/{id}")]
    public async Task<IActionResult> UpdateProdutImagesByProductId(Guid id, [FromForm] List<ProductImageDetailsDto> productImages)
    {
        ApiResponseModel<string> apiResponse = await _productDetailServices.UpdateProductImagesByProductIdAsync(id, productImages, new Guid(UserId));
        return Ok(apiResponse);
    }

当我从 postman 或 swagger 传递数据时,API 端没有收到任何东西,productImages 参数有 count = 0。我像这样从邮递员那里传递数据:

productImages[0].ProductImage :  file
productImages[1].ProductImage :  file1

但是如果我修改我的 ProductImageDetailsDto class 并添加更多字段让我们说 IsDefault 如下所示:

public class ProductImageDetailsDto
{
    [Display(Name = "product image")]
    [AllowedExtensions(new string[] { ".jpg", ".png" })]
    public IFormFile ProductImage { get; set; }
    public bool IsDefault { get; set; }
}

如果我像这样从邮递员那里传递数据:

productImages[0].ProductImage :  file
productImages[0].IsDefault:      false
productImages[1].ProductImage :  file1
productImages[1].IsDefault:      true

一切正常,我正在接收数据,即 API 端的 ProductImage 和 IsDefault。

那么,如果我在 ProductImageDetailsDto 中只保留 IFormFile 字段,会有什么问题呢?我有什么遗漏或做错了什么吗?提前致谢。

注意:我不想在 API 中使用 List<IFormFile>IFormFileCollection 作为参数类型,因为我想使用自定义验证器 [AllowedExtension] 来验证图像,这就是为什么我在模型中创建 IFormFile 属性 并接受 List<ProductImageDetailsDto> 作为参数。

如果您只想传递 productImages[0].ProductImage,请更改您的代码,删除 [ApiController][FromForm]

// [ApiController]
[Route("[controller]")]
public class TestController : ControllerBase
{     
    [HttpPut("UpdateProductImagesByProductId/{id}")]
    public async Task<IActionResult> UpdateProdutImagesByProductId(Guid id, List<ProductImageDetailsDto> productImages)
    {

        return Ok();
    }
}

结果:

更新:

如果您想保留 [ApiController] 和自定义验证,请在操作中添加自定义属性并删除 [FromForm],如下所示:

public async Task<IActionResult> UpdateProdutImagesByProductId(Guid id,[AllowedExtensions(new string[] { ".jpg", ".png"})] List<IFormFile> files)

结果: