2009-03-03 18 views
5

Estoy muy nuevo en ASP.net MVC, así que por favor sea lo más descriptivo posible en su respuesta :)Carga de múltiples imágenes + campos de texto en ASP.NET MVC

Déjame simplificar lo que estoy tratando de hacer. Imagine que tengo un formulario en el que desea ingresar información sobre un automóvil. Los campos pueden ser: Marca, Modelo, Año, Imagen1, Imagen2.

En la parte inferior del formulario hay un botón "Guardar". El método del Controlador asociado guardará Image1 e Image2 en el disco, obtendrá sus nombres de archivo y los asociará con el modelo del automóvil, que luego se guardará en la base de datos.

¿Alguna idea?

Gracias chicos!

Editar

winob0t me tiene la mayor parte del camino. El único problema pendiente es el siguiente: Image1 e Image2 no son campos obligatorios, así que ahora puedo guardar 0,1 o 2 imágenes; pero si el usuario solo carga 1 foto, no tengo forma de saber si proviene de imageUpload1 o imageUpload2.

De nuevo, ¡se agradece cualquier ayuda!

Respuesta

7

En su controlador puede acceder a los archivos cargados como:

if(Request.Files.Count > 0 && Request.Files[0].ContentLength > 0) { 
     HttpPostedFileBase postFile = Request.Files.Get(0); 
     string filename = GenerateUniqueFileName(postFile.FileName); 
     postFile.SaveAs(server.MapPath(FileDirectoryPath + filename)); 
    } 

protected virtual string GenerateUniqueFileName(string filename) { 

    // get the extension 
    string ext = Path.GetExtension(filename); 
    string newFileName = ""; 

    // generate filename, until it's a unique filename 
    bool unique = false; 

    do { 
     Random r = new Random(); 
     newFileName = Path.GetFileNameWithoutExtension(filename) + "_" + r.Next().ToString() + ext; 
     unique = !File.Exists(FileDirectoryPath + newFileName); 
    } while(!unique); 
    return newFileName; 
} 

Los campos de texto llegarán a su acción del controlador como de costumbre, es decir Request.Form [...]. Tenga en cuenta que también necesitará establecer el enctype en el formulario para "multipart/form-data". Parece que comprende lo suficiente sobre ASP.NET MVC para hacer el resto. Tenga en cuenta también que puede declarar su etiqueta de formulario en la vista aspx de la siguiente manera, aunque puede usar el enfoque más tradicional si lo desea.

<% using(Html.BeginForm<FooController>(c => c.Submit(), FormMethod.Post, new { enctype = "multipart/form-data", @id = formId, @class = "submitItem" })) { %> 

<% } %> 
+0

¡Me tienes a mitad de camino! Solo un pequeño inconveniente: Image1 e Image2 no están garantizados para estar allí. Entonces, ¿qué pasa si el usuario solo proporciona Image2 y no Image1? ¿Hay alguna forma de saber de qué control de carga proviene? –

+0

en lugar de Request.Files [0], debería poder utilizar Request.Files ["formInputname"] – LaserJesus

+0

if (Request.Files ["formInputname"]! = Null && Request.Files ["formInputname"]. ContentLength> 0) – LaserJesus

1

Aquí está mi solución, la respuesta anterior no funcionó para mi situación. No le importan los detalles del formulario y permitirá múltiples cargas.

for (int i = (Request.Files.Count - 1); i >= 0; i--) 
    { 
      if (Request.Files != null && Request.Files[i].ContentLength > 0) 
      { 
       string path = this.Server.MapPath("~/Content/images/"); 
       string filename = Path.GetFileName(Request.Files[i].FileName); 
       string fullpath = Path.Combine(path, filename); 
       Request.Files[i].SaveAs(fullpath); 
      } 
    } 
Cuestiones relacionadas