在 .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)
结果:
我在我的项目中使用 .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)
结果: