Buenas! Hoy voy a responder alguna pregunta que me he encontrado en alguna vez, y es como subir ficheros al servidor usando MVC2.
La verdad es que con ASP.NET MVC2 subir ficheros al servidor es extremadamente simple. Vamos a empezar viendo el código de una vista que permite subir un fichero al servidor, junto con una descripción adicional. La vista básicamente contiene un <form> como el siguiente:
<form action="<%: Url.Action("Upload") %>" enctype="multipart/form-data" method="post">
<label for="descripcion">Descripción del fichero:</label>
<input type="text" id="descripcion" name="descripcion" />
<br />
<label for="fichero">Fichero:</label>
<input type="file" name="fichero" size="40">
<br />
<input type="submit" value="Enviar" />
</form>
Fijaos que es HTML puro y duro, aunque el tag <form> lo podeis generar con Html.BeginForm() si queréis. La clave es añadir el atributo enctype con el valor multipart/form-data. Como se menciona en la especificación sobre formularios del W3C, el valor de multipart/form-data es el que debe usarse cuando se quieran enviar al servidor datos binarios.
El <input type=”file”> es el control HTML que nos permite seleccionar un fichero para enviar.
Y desde el controlador? Pues sencillo, en este caso mi formulario tiene dos parámetros (descripcion y fichero), por lo que necesitaré que la acción del controlador tenga esos dos parámetros. El parámetro descripcion es un string, pero el parámetro fichero… que és?
Pues bien ASP.NET MVC es capaz de ver que el parámetro fichero es un fichero que se ha subido al servidor y sabe mapearlo a un objeto de la clase HttpPostedFileBase. Esta clase nos da acceso no sólo al contenido del fichero subido, sinó a más información (su content-type, su tamaño, el path completo desde donde se ha subido,…).
El método del controlador queda pues, así de sencillo:
[HttpPost]
public ActionResult Upload(string descripcion, HttpPostedFileBase fichero)
{
fichero.SaveAs(Path.Combine(@"d:temp", Path.GetFileName(fichero.FileName)));
return View();
}
Fijaos en los dos parámetros string y HttpPostedFileBase. El método simplemente se guarda una copia del fichero subido en d:temp, pero obviamente aquí podéis hacer lo que queráis.
Y listos! No hay que hacer nada más… qué, sencillo, no??? 🙂
Un saludo
PD: Esta técnica no es ajax, eso significa que mientras se está subiendo el fichero al servidor, la aplicación web no responde (el browser está haciendo la petición). Existe un mecanismo para realizar subidas de ficheros en background, aunque no es directo debido a que con XMLHttpRequest (el objeto del naveagador que hace posible ajax) no se pueden subir ficheros. Si estáis interesados en el siguiente post de John Rudolf se muestra como realizar un upload de fichero en ajax usando jQuery y el form plugin!
Gracias por estar continuamente contestando mis dudas 🙂
Buenas! Una pregunta que últimamente parece que se pregunta varias veces en los foros de ASP.NET MVC
Hola, buen aporte, pero no veo en el ejemplo la intervención del modelo, no es necesario??
@Richof
El modelo? Este post simplemente muestra como obtener des de un controlador el fichero que el usuario ha subido. Y ya está. El modelo intervendría ahora: guardaría este fichero en disco, bbdd, actualizaría lo que fuese necesario, etc…
Pero eso ya depende de cada aplicación, por supuesto!
Saludos!
Hola que tal estoy tratando de hacer esto pero quiero subir el fichero a una ruta relatiba para colocarla en mi sitio web y no me peromite ya que al hacerlo me tira error por no ser directorio raiz :S ayuda por favor!!
Gracias por la info 🙂
Buenas! Vamos a ver en este post como podemos tratar la subida de ficheros en WebApi. En ASP.NET MVC