传递 IFormFile 集合时,端点中的 FormData 参数始终为空

问题描述 投票:0回答:1

以下

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
类型继续处理项目。

enter image description here

c# asp.net asp.net-web-api multipartform-data clean-architecture
1个回答
0
投票

经过尝试后,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版本,或者是否在我找不到的文档中提到过。

© www.soinside.com 2019 - 2024. All rights reserved.