Subir ficheros en ASP.NET

Actualización: ahora podéis subir ficheros con AJAX muy fácilmente con el FileUpload AJAX

Recuerdo mis viejos tiempos con ASP 3.0 en el que utilicé un algoritmo para subir ficheros... en total más de 500 líneas!!
Eso sí, el fichero lo subía muy bien . Es decir, comprobaba que era de cierto tipo específico (por ejemplo una imagen) que ocupaba menos de cierto tamaño, que no era un ejecutable, etc.

¡Pero el código era lo más zarrapastroso (== asqueroso == feo == realmente feo) que he visto en mucho tiempo!
Tanto es así, que en adelante usé PHP para esas cositas específicas, pues con muy pocas líneas se consiguen resultados muy buenos.

Pero como siempre ASP.NET nos lleva a un nivel de sencillez mucho mayor. Veamoslo

1.- El control FileUpload
El control FileUpload es el encargado de que todo sea tan sencillo. No tenemos más que arrastrarlo desde la caja de herramientas. Añadimos también un botón que apretaremos cuando queramos subir el fichero. Obtenemos:

    <asp:FileUpload ID="FileUpload1" runat="server" />
    <asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click" />


2.- Subir el fichero de forma muuuy sencilla
La sencillez absoluta a la hora de subir un fichero es un simple

        FileUpload1.SaveAs(Server.MapPath("~/Upload"));

De ese modo el fichero se guardará en el directorio Upload.
¡¡Sobra decir que es estrictamente necesario tener permisos de escritura en el directorio de subida!!

3.- Funciones avanzadas
Pero si queréis llevar a cabo funciones más avanzadas como comprobar el tipo de fichero, su longitud, trabajar con el stream antes de guardar, etc... también lo tenéis muy fácil.

Hay varios modos de hacerlo con el FileUpload, pero yo os aconsejo recoger el objeto HttpPostedFile, pues desde éste podéis acceder a los elementos más importantes del fichero:

        HttpPostedFile mifichero = FileUpload1.PostedFile;

        // Longitud en Kb
        double Kb = mifichero.ContentLength / 1024;

        // Nombre del fichero
        string nombreFichero = mifichero.FileName;

        // El tipo mime
        string mimeType = mifichero.ContentType;

        // El FileStream correspondiente
        FileStream stream = (FileStream)mifichero.InputStream;

        // Y finalmente guardar el resultado
        mifichero.SaveAs(Server.MapPath("~/Upload"));


4.- HttpRuntime
Como era de esperar, ASP.NET ofrece un nivel extra de protección a la hora de permitir la subida de ficheros.
Los dos  parámetros de configuración  más importantes, definen la longitud máxima del fichero y el tiempo máximo que pasará tras el cual el motor de ASP.NET cortará la subida del fichero.

Por defecto la longitud máxima del fichero es de 4 Mbytes, y el tiempo máximos es de 90 segundos en ASP.NET 1.x y 110 en ASP.NET 2.0

Si queremos modificar esos valores por defecto, en nuestro Web.Config, dentro del elemento System.Web, ubicaríamos:

    <httpRuntime maxRequestLength="longitud kbytes" executionTimeout="segundos" />


Nota: como consejo personal, os pido que no abuséis de la subida de ficheros por parte de usuarios anónimos, pues es bastante sencillo tumbar un website si no se toman las medidas de precaución adecuadas.