2011-12-18 34 views
37

Tengo un problema cuando cargo un archivo en ASP.NET MVC. Mi código es el siguiente:HttpPostedFileBase siempre devuelve nulo en ASP.NET MVC

Vista:

@{ 
    ViewBag.Title = "Index"; 
    Layout = "~/Views/Shared/_Layout.cshtml"; 
} 

<h2>Index2</h2> 
@using (Html.BeginForm("FileUpload", "Board", FormMethod.Post, new { enctype = "multipart/form-data" })) 
{ 
    <input type="file" /> 
    <input type="submit" /> 
} 

controlador:

[HttpPost] 
public ActionResult FileUpload(HttpPostedFileBase uploadFile) 
{ 
    if (uploadFile != null && uploadFile.ContentLength > 0) 
    { 
     string filePath = Path.Combine(Server.MapPath("/Temp"), Path.GetFileName(uploadFile.FileName)); 
     uploadFile.SaveAs(filePath); 
    } 
    return View(); 
} 

Pero uploadfile siempre devuelve un valor nulo. ¿Alguien puede descubrir por qué?

Respuesta

94
@{ 
    ViewBag.Title = "Index"; 
    Layout = "~/Views/Shared/_Layout.cshtml"; 
} 

<h2>Index2</h2> 
@using (Html.BeginForm("FileUpload", "Board", FormMethod.Post, new { enctype = "multipart/form-data" })) 
{ 
    <input type="file" name="uploadFile"/> 
    <input type="submit" /> 
} 

tiene que proporcionar nombre de archivo de tipo de entrada a uploadfile con el fin de modelar el trabajo obligatorio en ASP.net MVC y
También asegúrese de que nombre de su nombre de archivo y el argumento del tipo de entrada deHttpPostedFileBase es idéntico.

+0

wow ... muchas gracias. No tenía idea sobre este MVC. Soy muy nuevo en ASP.NET MVC. Gracias. –

+36

No había omitido el nombre del campo pero tuve el mismo problema 'nulo' debido a que faltaba el parámetro enctype en la definición del formulario. Gracias por el ejemplo. – niallsco

+0

@dotnetstep gracias – anpatel

0

Puede haber otro escenario también. En mi caso, estaba recibiendo este problema porque estaba procesando directamente la etiqueta de script en mi vista de MVC y IE está dando problemas allí.

código correcto a la vista debe ser de la siguiente manera:

@section scripts 
{ 
    <script> 
     $(document).ready(function() { 
      $('.fileinput').fileinput(); 
... 
} 
6

que había probado la mayoría de las soluciones publicadas en línea para este tema, pero ha resultado ser mejor usar una solución alternativa en lugar ..

Realmente no importaba lo que hice, HttpPostedFileBase y/o HttpPostedFile siempre fueron nulos. El uso de la colección HttpContext.Request.Files pareció funcionar sin problemas.

p. Ej.

if (HttpContext.Request.Files.AllKeys.Any()) 
     { 
      // Get the uploaded image from the Files collection 
      var httpPostedFile = HttpContext.Request.Files[0]; 

      if (httpPostedFile != null) 
      { 
       // Validate the uploaded image(optional) 

       // Get the complete file path 
       var fileSavePath =(HttpContext.Server.MapPath("~/UploadedFiles") + httpPostedFile.FileName.Substring(httpPostedFile.FileName.LastIndexOf(@"\"))); 

       // Save the uploaded file to "UploadedFiles" folder 
       httpPostedFile.SaveAs(fileSavePath); 
      } 
     } 

En el ejemplo anterior sólo agarrar el primer archivo, pero es sólo una cuestión de bucle, aunque la colección para guardar todos los archivos.

HTH

Rob

3

En mi escenario, el problema era con atributo id, que tenían la siguiente:

<input type="file" name="file1" id="file1" /> 

El soultion era eliminar Identificación:

<input type="file" name="file1" /> 
+3

Damm, en mi caso, estaba usando HttpPostedFile en lugar de HttpPostedFileBase .. error del programador:/ –

+0

¡Samuel me salvaste el día! Aunque se explica en http://stackoverflow.com/a/24911221/2346618, creo que es una tontería usar una clase base HttpPostedFileBase en la firma. En la programación orientada a objetos, las clases base se utilizan para ayudar a la construcción de clases e interfaces concretas para protocolos. El uso de una interfaz como IHttpPostedFile será menos propenso a error OMI. –

Cuestiones relacionadas