Subiendo múltiples imágenes + campos de texto en ASP.NET MVC
-
03-07-2019 - |
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!
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);
}
}