以下
CreateImages
端点位于我的 C# .NET Web API 中。使用Postman和Swagger UI进行测试,当我上传文件并发送请求时,下面的files
参数始终为空。如果我将参数更新为单个IFormFile
,则不会出现此问题,只有当我尝试传递列表时才会出现此问题。
public class Images : EndpointGroupBase
{
public override void Map(WebApplication app)
{
app.MapGroup(this)
.DisableAntiforgery()
.RequireAuthorization()
.MapPost(CreateImages);
}
public async Task<IResult> CreateImages(ISender sender, [FromForm] IList<IFormFile> files)
{
return Results.Ok(await sender.Send(new CreateImagesCommand(files)));
}
}
我对以下类型也遇到同样的问题:
IList
、List
、ICollection
、IEnumerable
。如果我传递一个数组 (IFormFile[]
),即使使用 [FromForm]
标签,它也不会被注册为 multipart/form-data
,但需要一个字符串列表。我认为无论如何都不推荐这样做。另外,如前所述,如果我更新此端点以接受单个 IFormFile
,一切都会按预期工作 - 值不为空,并且调试器可以按预期 IFormFile
类型继续处理项目。
经过尝试后,Minimal API 似乎只需要
IFormFileCollection
作为多个文件上传的有效类型。更改参数即可解决问题。
对于任何想要尝试的人,请在 .NET 8.0 中启动一个空项目,并使用下面的最小 API 添加端点。尝试不同类型的
files
参数;我尝试了ICollection
,IList
,List
,IReadOnlyCollection
。所有这些都会失败,并显示 415 不支持的类型。
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
// POST endpoint for multiple file upload
app.MapPost("/upload-multiple", async (IFormFileCollection files) =>
{
if (files.Any())
{
foreach (var file in files)
{
var filePath = Path.Combine("uploads", file.FileName);
using (var stream = new FileStream(filePath, FileMode.Create))
{
await file.CopyToAsync(stream);
}
}
return Results.Ok("Files uploaded successfully.");
}
return Results.BadRequest("No files uploaded.");
}).DisableAntiforgery();
app.Run();
不确定这是否特定于更高的.NET版本,或者是否在我找不到的文档中提到过。