Search code examples
asp.net.netasp.net-core.net-6.0minimal-apis

How do I do file upload using ASP.NET Core 6 minimal api?


I want to create a simple file upload endpoint in ASP.NET Core 6 and thought it would be as easy as described here https://dotnetthoughts.net/handling-file-uploads-in-openapi-with-aspnet-core/.

When I have an endpoint defined like:

app.MapPost("/upload", (IFormFile file) =>
{
    //Do something with the file
    return Results.Ok();
}).Accepts<IFormFile>("multipart/form-data").Produces(200);

I get a 415 back when I call the endpoint. The message I get back is something like:

Expected a supported JSON media type but got "multipart/form-data; ...

Not sure why it expected a supported json when I say that the endpoint should accept multipart/form-data.

Any ideas or thoughts on what to do here?


Solution

  • Currently out of the box support for binding in Minimal APIs is quite limited. Supported binding sources:

    • Route values
    • Query string
    • Header
    • Body (as JSON)
    • Services provided by dependency injection
    • Custom

    NOTE: Binding from forms is not natively supported in .NET 6

    You can either leverage custom binding or use special types handling:

    app.MapPost("/upload", (HttpRequest request) =>
    {
        //Do something with the file
        var files = request.Form.Files;
        return Results.Ok();
    })
    .Accepts("multipart/form-data")
    .Produces(200);
    

    UPD

    Since Minimal APIs should be able to bind IFormFile/IFormFileCollection directly:

    app.MapPost("/upload", async (IFormFile file) =>
    {
        // ...
    });
    
    app.MapPost("/upload_many", async (IFormFileCollection myFiles) =>
    {
        foreach (var file in myFiles)
        {
            // ...
        }
    });