Upload multiple files in one form MVC4

asp.net-mvc, asp.net-mvc-4, c#, file-upload

Solution

Your problem is that you form creates a post request with information that the model binder can bind because the naming convention is not right.

you see, you have 4 file fields each with a different name, for the model binder to bind them correctly your controller action signature should look like this:

public ActionResult Create(HttpPostedFileBase mgmFile, 
                           HttpPostedFileBase logoFile, 
                           HttpPostedFileBase fohFile ,
                           HttpPostedFileBase bohFile)

Following MCV design pattern The best option would be to use a ViewModel that holds an `IEnumerable<HttpPostedFileBase>` and you would create a custom editor template for an `IEnumerable<HttpPostedFileBase>`

so that you could use it like that:

Html.EditorFor(m=>Model.filesUploaded)

and your controller action would look like this:

public ActionResult Create(MyViewModel i_InputModel)
{
    i_InputModel.filesUploade; //Use the files here to upload them.
}

Other options are: Use the HTML5 multiple attribute on the file input field like this:

<label for="mgmFile" class="col-sm-2 control-label">Files:</label>
<div class="col-sm-6">
    <input type="file" multiple="multiple" name="files" id="files" />
</div>

and a controller action like this:

public ActionResult Create(HttpPostedFileBase files)

or use multiple file fields but index them in their name:

<input type="file" multiple="multiple" name="files[0]" id="files_1" />
<input type="file" multiple="multiple" name="files[1]" id="files_2" />
<input type="file" multiple="multiple" name="files[2]" id="files_3" />
<input type="file" multiple="multiple" name="files[3]" id="files_4" />

and then you could use a controller action like this:

public ActionResult Create(IEnumerable<HttpPostedFileBase> files)

Problem

I'm trying to upload multiple images on one form ``` @using (Html.BeginForm("Create", "AdminRestaurants", FormMethod.Post, new { enctype = "multipart/form-data" })) { <div class="form-group"> <label for="logoFile" class="col-sm-2 control-label">Logo:</label> <div class="col-sm-6"> <input type="file" multiple="" name="logoFile" id="logoFile" /> </div> </div> <div class="form-group"> <label for="fohFile" class="col-sm-2 control-label">FOH Logo:</label> <div class="col-sm-6"> <input type="file" multiple="" name="fohFile" id="fohFile" /> </div> </div> <div class="form-group"> <label for="bohFile" class="col-sm-2 control-label">BOH Logo:</label> <div class="col-sm-6"> <input type="file" multiple="" name="bohFile" id="bohFile" /> </div> </div> <div class="form-group"> <label for="mgmFile" class="col-sm-2 control-label">MGM Logo:</label> <div class="col-sm-6"> <input type="file" multiple="" name="mgmFile" id="mgmFile" /> </div> </div> ``` I'm trying to process the form on the controller with this ``` public ActionResult Create(IEnumerable<HttpPostedFileBase> files, RestaurantModel collection) { if (ViewData.ModelState.IsValid) { } } ``` Currently nothing shows up in the `files` signature on the controller. This seems to work great when only working with one file ``` public ActionResult Create(HttpPostedFileBase file, EventsModel collection) ``` Can someone point me in the direction to allow multiple files to be uploaded with one submission form?

Original source