En los tiempos de ASP 3.0 subir archivos al servidor "a pelo", es decir, sin usar controles de terceros para hacerlo era una tarea harto difícil. Se podía conseguir (nosotros en Krasis, por ejemplo, desarrollamos un componente puro ASP que lo hacía perfectamente), pero era muy complicado y no exento de problemas.

En ASP.NET esta tarea se ha convertido en algo mucho más sencillo. En realidad no tanto como algunos se piensan (dentro de un momento diré algo más sobre esto), pero desde luego fácil y rápido de implementar para las ocasiones más normales.

Para hacerlo basta con usar el control HtmlInputFile del espacio de nombres System.Web.HtmlControls, así:

<INPUT id=SelectorDeArchivos type=file runat="server">

Al colocarle el atributo de ejcución en el servidor luego podemos acceder a sus propiedades y métodos una vez enviado el formulario al servidor. Gracias a ello podemos acceder de forma simple a la información sobre el archivo enviado. Sólo hay una propiedad importante en este control:

  • PostedFile: devuelve una referencia a un objeto HttpPostedFile, definido en System.Web que ofrece información sobre el archivo que se acaba de subir.

El objeto HttpPostedFile tiene varias propiedades y un método interesantes:

  • FileName: indica el nombre y la ruta completa del archivo que hemos subido. No hay que fiarse de esto para validar los tipos de archivo subidos ya que es fácil cambiar la extensión de unejecutable para hacerlo pasar por uno de texto, por ejemplo. Es mejor usar la siguiente propiedad.
  • ContentType: especifica el tipo MIME real del archivo enviado. Por ejemplo "text/plain" para archivos de texto, o "application/msword" para archivos de Word. Este es el verdadero tipo que hay que comprobar.
  • ContentLength: el tamaño en bytes del archivo subido.
  • SaveAs: método que guarda el archivo recibido en la ruta y con el nombre especificados.

Con estos elementos es muy fácil crear una página para permitir la subida de archivos a la Web. Pulsando aquí te puedes descargar un pequeño ejemplo que he hecho con WebMatrix que ilustra el uso de este control (ZIP, 1 KB).

Por cierto, se me olvidaba. Muy importante: el formulario de la página actual tiene que tener el atributo enctype establecido con el valor multipart/form-data, así:

<FORM encType=multipart/form-data runat="server">

De todos modos no todo es tan fácil. En el próximo post voy a explicar las limitaciones de este control y todos los problemas que podemos tener por utilizarlo, viendo así casos prácticos que se nos pueden presentar.

Permanece sintonizado :-)

Escrito por un humano, no por una IA