2009-02-13 14 views
15

En la Vista:Subida HttpPostedFile es nulo

<% =Html.BeginForm("About", "Home", FormMethod.Post, new {enctype="multipart/form-data "})%> 
    <input type="file" name="postedFile" /> 
    <input type="submit" name="upload" value="Upload" /> 
<% Html.EndForm(); %> 

en el controlador, hay algo como esto:

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult About(HttpPostedFile postedFile) 
{ 
    //but postedFile is null 
    View(); 
} 

postedFile es nulo en Acerca de(). ¿Cómo cargo el archivo?

+3

simplemente notando para cualquier otra persona que encuentre el mismo problema ... El problema real aquí es 'enctype =" multipart/form-data "' hay un espacio al final del valor del atributo y créeme, Firefox lo reiniciará a enctype predeterminado. No lo notarás en cromo. Me he enfrentado al mismo problema y cuando descubrí y eliminé ese espacio adicional, todo salió bien ...! Espero que ahorre unos minutos a alguien ...! –

+1

checkout [Entrada del blog de Scott Hansleman] (http://www.hanselman.com/blog/ABackToBasicsCaseStudyImplementingHTTPFileUploadWithASPNETMVCIncludingTestsAndMocks.aspx) – Matthew

Respuesta

7

Esto no responde por qué su parámetro es nulo, pero puede profundizar en la solicitud directamente. Sin embargo, esta podría no ser la forma más "MVC" de hacer esto. prueba este método en su cuerpo:

var upload = Request.Files["postedFile"] 
if (upload.ContentLength > 0) 
{ 
    // Do whatever 
} 

a ser más "MVC" Usted podría tirar de que el código fuera de su controlador en una implementación IModelBinder y el uso de un objeto personalizado como un parámetro para el método. Este Scott Hanselman blog post muestra los pasos para implementar un ModelBinder personalizado.

1

También tengo algunos caprichos con <%= Html.BeginForm ...%>. Entonces, uso el uso. Nuevamente, en el lado del Controlador, solo tomo mis archivos cargados desde el objeto de solicitud.

Pruebe esto. Funciona:

<% using (Html.BeginForm("Post", "Home", FormMethod.Post, new {enctype = "multipart/form-data"})) 
    {%> 

    <input type="file" id="postedFile" name="PostedFile" /> 
    <input type="submit" /> 

<% 
} 

%>

[AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult Post(FormCollection form) 
    { 
     HttpPostedFileBase postedFile = Request.Files["PostedFile"]; 
     return RedirectToAction("Index"); 
    } 
+0

el archivo publicado aún es nulo –

+0

Simplemente copie y pegue la acción y la vista de mi controlador. Esto funciona para mi. Tenga en cuenta que mi método de acción no está tomando HttpPostedFile como argumento. –

2

¿Qué versión de MVC está usando? Ahora con el candidato RC intenté usar HttpPostedFile y obtuve un "no tiene un error de constructor en blanco". Tuve que usar HttpPostedFileBase.

Más importante aún, es la versión de MVC que está ejecutando, dependiendo de la versión, cómo será diferente su recuperación de un archivo publicado.

27

Utilice HttpPostedFileBase (no HttpPostedFile) y también denomine el parámetro exactamente como en el formulario. p.ej. si tiene

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

usted tiene que tener la cabeza método:

public ActionResult About(HttpPostedFileBase file1) 
+0

Y la identificación y el nombre deben ser los mismos ¿no? –

+1

en realidad, solo el nombre es obligatorio (y debe ajustarse al nombre de los parámetros del método). La identificación solo es usada por javascript y css (simplificado). –

+2

Tuve exactamente el mismo problema y una vez que cambié el tipo de parámetro de acción de 'HttpPostedFile' a' HttpPostedFileBase', funcionó. Entonces esa sugerencia debería ser enfatizada. –

4

que tenía el mismo problema:

Hay que definir un nombre y el ID para el elemento de entrada:

<input type="file" name="postedFile" id="postedFileId" /> 

saludos

Stefan

3

Debe eliminar el espacio desde el final del atributo enctype:

new {enctype="multipart/form-data "} => new {enctype="multipart/form-data"} 
2

Un espacio vacío después de "multipart/form-data" es el verdadero problema ...

2

está usando jquery mobile?Si es así, tendrá que ajustar a @data_ajax falsa

new { enctype = "multipart/form-data", @data_ajax = "false" } 
1

Además, he encontrado que la declaración forma en la que se encuentra la carga de archivos debe tener siempre

new {enctype="multipart/form-data"} 
2

uso de este

public ActionResult Upload(HttpPostedFileBase excelfile) 

cambio HttpPostedFile para HttpPostedFileBase

1

Aquí están todos los bits que necesitan uplaod un archivo

//in your model 
public partial class Profile 
{ 
    [DisplayName("Image Upload")] 
    [DataType(DataType.Upload)] 
    public HttpPostedFileBase FileUpload { get; set; } 
} 



// in your view 
@model ProjName.Blabla.Profile 

@using (Html.BeginForm("Edit", "Profile", FormMethod.Post, new { enctype = "multipart/form-data" })) 
{ 
    <input type="file" name="FileUpload" id="FileUpload" value="Choose File" class="form-control" /> 

    <input type="submit" value="Save" class="btn btn-default" /> 
} 
0
<form id="Form1" method="post" encType="multipart/form-data" runat="server"> 

Añadir encType="multipart/form-data" a su formulario.