Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Submitting multiple files to ASP.NET controller accepting an ICollection<IFormFile>

In my ASP.NET Core backend, I have a controller function that looks like this:

[HttpPost]
[Route("documents/upload")]
public async Task<IActionResult> UploadFile(ICollection<IFormFile> files)
{
   ...
}

In my front-end, I call the function like this:

var postSettings = {
    method: 'POST',
    credentials: 'include',
    mode: 'cors'
}
uploadDocuments( files ) {
    var data = new FormData();
    data.append('files', files);   
    postSettings.body = data;

    return fetch(endPoint + '/documents/upload', postSettings);
}

If "files" is a single file - not an array with one file, but a single File object - UploadFile is called with an ICollection<IFormFile> containing the single file.

If "files" is a list of files, either a FileList or an array of File objects, UploadFile is called with an empty ICollection<IFormFile>.

How do I submit a list of files in such a way that they can be parsed as an ICollection<IFormFile>?

like image 631
Simon Christiansen Avatar asked Apr 17 '17 17:04

Simon Christiansen


People also ask

How do I upload files to IFormFile?

Upload Single FileTo add view, right click on action method and click on add view. Then select View from left side filter and select Razor View – Empty. Then click on Add button. Create design for your view as per your requirements.

How do I upload multiple files to .NET core?

Uploading Multiple files in ASP.NET Core MVC To Upload multiple files, navigate to " HomeController. cs " and now in the arguments we will take multiple files using "List<IFormFile>" and we will loop through each file to save it on physical drive.


1 Answers

Reference Uploading multiple files at once - with Fetch

uploadDocuments(endPoint, files) {
    var postSettings = {
        method: 'POST',
        credentials: 'include',
        mode: 'cors'
    };
    var data = new FormData();
    if(files.length > 0) {
        for(var x = 0; x < files.length; x++) {
            // the name has to be 'files' so that .NET could properly bind it
            data.append('files', files.item(x));    
        }
    } 
    postSettings.body = data;

    return fetch(endPoint + '/documents/upload', postSettings);
}

Reference Uploading small files with model binding

When uploading files using model binding and the IFormFile interface, the action method can accept either a single IFormFile or an IEnumerable<IFormFile> (or List<IFormFile>) representing several files. The following example loops through one or more uploaded files, saves them to the local file system, and returns the total number and size of files uploaded.

[HttpPost]
[Route("documents/upload")]
public async Task<IActionResult> Post(List<IFormFile> files)
{
    long size = files.Sum(f => f.Length);

    // full path to file in temp location
    var filePath = Path.GetTempFileName();

    foreach (var formFile in files)
    {
        if (formFile.Length > 0)
        {
            using (var stream = new FileStream(filePath, FileMode.Create))
            {
                await formFile.CopyToAsync(stream);
            }
        }
    }

    // process uploaded files
    // Don't rely on or trust the FileName property without validation.

    return Ok(new { count = files.Count, size, filePath});
}
like image 178
Nkosi Avatar answered Oct 20 '22 14:10

Nkosi