Pregunta

Soy muy nuevo en ASP.net MVC, así que sea lo más descriptivo posible en su respuesta :)

Déjame simplificar lo que estoy tratando de hacer. Imagina que tengo un formulario en el que deseas 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 " Guardar " botón. El método del Controlador asociado guardará la Imagen1 y la Imagen2 en el disco, obtendrá sus nombres de archivo y los asociará con el modelo de automóvil, que luego se guardará en la base de datos.

¿Alguna idea?

Gracias chicos!

Editar

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

De nuevo, cualquier ayuda es apreciada!

¿Fue útil?

Solución

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 la acción de su controlador como es habitual, es decir, Solicitud.Form [...]. Tenga en cuenta que también deberá establecer el enctype en el formulario en " multipart / form-data " ;. Parece que entiendes 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" })) { %> 

<% } %>

Otros consejos

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

    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);
           }
     }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top