net mvc how files asp c# asp.net-mvc razor upload httppostedfilebase

c# - how - upload files asp net mvc 5



Subida de ASP MVC FILE HttpPostedFileBase es nula (4)

En mi controlador, porque quería poder completar algunos detalles sobre el video y subirlo, la clase Video no necesita el video porque se pasará a otro servicio web.

public class VideoUploadModel { public HttpPostedFileBase vid { get; set; } public Video videoModel { get; set; } } // // POST: /Video/Create [HttpPost] public ActionResult Create(VideoUploadModel VM) { if (ModelState.IsValid) { db.Videos.AddObject(VM.videoModel); db.SaveChanges(); return RedirectToAction("Index"); } ViewBag.UserId = new SelectList(db.DBUsers, "Id", "FName", VM.videoModel.UserId); return View(VM); }

y en mi opinión tengo

@model LifeHighlightsShoeLace.Controllers.VideoController.VideoUploadModel @{ ViewBag.Title = "Create"; } <h2>Create</h2> <script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>

@using (Html.BeginForm("Create", "Video", FormMethod.Post, new { enctype = "multipart/form-data" })) { @Html.ValidationSummary(true) <fieldset> <legend>Video</legend> <div class="editor-label"> @Html.LabelFor(model => model.videoModel.KalturaID) </div> <div class="editor-field"> @Html.EditorFor(model => model.videoModel.KalturaID) @Html.ValidationMessageFor(model => model.videoModel.KalturaID) </div> <div class="editor-label"> @Html.LabelFor(model => model.videoModel.Size) </div> <div class="editor-field"> @Html.EditorFor(model => model.videoModel.Size) @Html.ValidationMessageFor(model => model.videoModel.Size) </div> <div class="editor-label"> @Html.LabelFor(model => model.videoModel.Date) </div> <div class="editor-field"> @Html.EditorFor(model => model.videoModel.Date) @Html.ValidationMessageFor(model => model.videoModel.Date) </div> <div class="editor-label"> @Html.LabelFor(model => model.videoModel.UploadedBy) </div> <div class="editor-field"> @Html.EditorFor(model => model.videoModel.UploadedBy) @Html.ValidationMessageFor(model => model.videoModel.UploadedBy) </div> <div class="editor-label"> @Html.LabelFor(model => model.videoModel.UserId, "User") </div> <div class="editor-field"> @Html.DropDownList("UserId", String.Empty) @Html.ValidationMessageFor(model => model.videoModel.UserId) </div> <div class="editor-field"> <input name="model.vid" type="file" /> </div> <p> <input type="submit" value="Create" /> </p> </fieldset>

}

Cuando envío el formulario, se completa la parte de videoModel de VM, pero el archivo real es nulo. ¿Algunas ideas?


La razón por la que no es vinculante es porque el RouteData modelos solo busca en QueryString , Form y RouteData cuando vincula un modelo complejo como el suyo. La forma de evitar esto es tener otro parámetro en su método de acción. (Cambie su "nombre" a solo "video" también)

[HttpPost] public ActionResult Create(VideoUploadModel VM, HttpPostedFileBase vid) { //add your vid to the model or whatever you want to do with it :) if (ModelState.IsValid) { db.Videos.AddObject(VM.videoModel); db.SaveChanges(); return RedirectToAction("Index"); } ViewBag.UserId = new SelectList(db.DBUsers, "Id", "FName", VM.videoModel.UserId); return View(VM); }


cambio

<input name="model.vid" type="file" />

a

@Html.TextBoxFor(model => model.vid, new {type="file"})

dependiendo de qué más esté en su página, y donde se está visualizando la vista, el MVC generará identificaciones únicas, creo que su identificación codificada no está asociada correctamente con los campos del formulario.


Actualización de acuerdo con el comentario OP

establecer la longitud máxima del archivo en el archivo web.config Cambiar el "?" a un tamaño de archivo que desea que sea su máximo, por ejemplo 65536 es 64 MB

<configuration> <system.web> <httpRuntime maxRequestLength="?" /> </system.web> </configuration>

No puede agregar el archivo al modelo, estará en su propio campo y no formará parte del modelo

<input name="videoUpload" type="file" />

Tu acción es incorrecta Necesita aceptar el archivo como su propio parámetro (o si usa múltiples IEnumerable<HttpPostedFileBase> como el tipo de parámetro)

[HttpPost] public ActionResult Create(VideoUploadModel VM, HttpPostedFileBase videoUpload) { if (ModelState.IsValid) { if(videoUpload != null) { // save the file var serverPath = server.MapPath("~/files/" + newName); videoUpload.SaveAs(serverPath); } db.SaveChanges(); return RedirectToAction("Index"); } ViewBag.UserId = new SelectList(db.DBUsers, "Id", "FName", VM.videoModel.UserId); return View(VM); }

Si permitía que se seleccionaran varios archivos, debe tener en cuenta que

[HttpPost] public ActionResult Create(VideoUploadModel VM, IEnumerable<HttpPostedFileBase> videoUpload) { if (ModelState.IsValid) { if(videoUpload != null) { // save the file foreach(var file in videoUpload) { var serverPath = server.MapPath("~/files/" + file.Name); file.SaveAs(serverPath); } } db.SaveChanges(); return RedirectToAction("Index"); } ViewBag.UserId = new SelectList(db.DBUsers, "Id", "FName", VM.videoModel.UserId); return View(VM); }


Funciona para mi:

public class CreateVeiwModel { public Speaker Speaker { get; set; } public Guid Guid { get; set; } public HttpPostedFileBase File { get; set; } }

Controlador:

[HttpPost] public ActionResult Create(CreateVeiwModel model) { if (ModelState.IsValid) try { Repository.AddSpeaker(model.Speaker); ... }

Ver:

@Html.Label("Most Up-to-Date CV") <input type="file" name="File"/>

Creo que la solución se colocó allí: Model.File ~ <input name="File"/>