Uploading files with MVC 3

久未见 提交于 2019-12-19 10:26:04

问题


I'm growing thin learving mvc3. I have the following code in my controller

    [HttpPost]
    public ActionResult Accreditation(Accreditation accreditation)
    {
        if (ModelState.IsValid)
        {
            var fileUpload = Request.Files[0];
            var uploadPath = Server.MapPath("~/App_Data/uploads");

            using (var fs = new FileStream(Path.Combine(uploadPath, accreditation.PressCard.ToString()), FileMode.Create))
            {
                var buffer = new byte[fileUpload.InputStream.Length];
                fileUpload.InputStream.Read(buffer, 0, buffer.Length);

                fs.Write(buffer, 0, buffer.Length);
            }

            context.Accreditations.Add(accreditation);
            context.SaveChanges();

            return RedirectToAction("Index");  
        }


           ViewBag.PossibleNationalities = context.Nationalities;
            ViewBag.PossibleNchis = context.Nchis;
            ViewBag.PossibleMedia = context.Media;
            ViewBag.PossibleEmploymentStatus = context.EmploymentStatus;
            return View(accreditation);



    }
}

Here's the View:

@using (Html.BeginForm("Accreditation", "Home", new { enctype = "multipart/form-data" },    FormMethod.Post))
{
   @Html.ValidationSummary(true)
.............
.............

<div class="editor-field">
       <input type="file" name="PressCard" id="PressCard" data-val-required="Press card is required" data-val="true"/>
         @Html.ValidationMessageFor(model => model.PressCard)
    </div>

    <div class="editor-label">
        @Html.LabelFor(model => model.Passport)
    </div>
    <div class="editor-field">
       <input type="file" name="Passport" id="Passport" data-val-required="ID/Passport is required" data-val="true"/>
        @Html.ValidationMessageFor(model => model.Passport)
    </div>

....... ........

When I try to upload, i get the following error message:

Exception Details: System.ArgumentOutOfRangeException: Index was out of range. Must be non-negative and less than the size of the collection. Parameter name: index

Any one out there with a pointer to the right direction?


sorry for delay. Here's the new code

[HttpPost]
public ActionResult Accreditation(Accreditation accreditation, HttpPostedFileBase Passport)
    {
        if (ModelState.IsValid)
        {
            var uploadPath = Server.MapPath("~/App_Data/uploads");

            using (var fs = new FileStream(Path.Combine(uploadPath, accreditation.PressCard.ToString()), FileMode.Create))
            {
                var buffer = new byte[Passport.InputStream.Length];
                Passport.InputStream.Read(buffer, 0, buffer.Length);

                fs.Write(buffer, 0, buffer.Length);
            }

            context.Accreditations.Add(accreditation);
            context.SaveChanges();

            return RedirectToAction("Index");  
        }


           ViewBag.PossibleNationalities = context.Nationalities;
            ViewBag.PossibleNchis = context.Nchis;
            ViewBag.PossibleMedia = context.Media;
            ViewBag.PossibleEmploymentStatus = context.EmploymentStatus;
            return View(accreditation);



    }
}

回答1:


Are really uploading data? I'd suggest you use this way. Create a parameter of type HttpPostedFileBase with the same name as the input field and test for its content length property.

Don't forget to use the same name for the parameter and for the input tag.

Checking this link will the fastest way for you to move on.

MVC 3 file upload and model binding




回答2:


var fileUpload = Request.Files[0]; is the line where you have your exception, isn't it? You should expect the file to be stored in the property of class Accreditation, not in Request.Files.

So you need properties PressCard and Passport in Accreditation, both of type HttpPostedFileBase, and then use these properties in your code.




回答3:


Get your posted file directly in action:

Here is discussion on SO: MVC 3 file upload and model binding

[HttpPost]
public ActionResult Accreditation(Accreditation accreditation, HttpPostedFileBase Passport)
{
    ...
}


来源:https://stackoverflow.com/questions/7471179/uploading-files-with-mvc-3

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!