ASP Fcil
El sitio para programadores ASP  

Búsqueda rápida
Ayuda
Secciones
Portada
Diario
Artículos
Código
Trucos
Foros ASP
Recursos
Favoritos
Referencia
Tutorial SQL
SQL-O-Matic
Otras
Boletín ASPFácil
Colabora
Sobre este sitio
Anunciarse aquí
Cont@ctar
Formación


Versión para imprimir / Salvar en Favoritos

Subir ficheros al servidor mediante xelUpload

Quieres subir ficheros al servidor mediante un formulario, con uno o varios campos de tipo FILE, pero no puedes utilizar ASPUpload, no quieres pagarlo o no puedes registrar componentes. Aquí tienes una completa solución de upload de ficheros, escrita 100% en ASP y VBScript.

Introducción

Subir ficheros al servidor mediante un formulario es una opción que nos brinda HTML muy poderosa, en cuanto que nos permite crear aplicaciones web más completas: podemos hacer nuestro propio sistema de FTP casero, vía web, podemos dejar a nuestros colaboradores que suban sus imágenes, etc. todo a través de una página web.

Lamentablemente, ASP no nos proporciona un mecanismo automático para procesar este tipo de envíos. Por esto, se hace necesario extender el entorno ASP, bien con productos comerciales como ASPUpload y SA-FileUp, o bien escribiendo nuestro propio programa.

El problema de utilizar componentes, ya sean propios o comprados (o pirateados... ¿quién ha dicho eso?) es que en muchos planes de alojamiento no nos es posible registrar estos componentes. En estos casos, la única solución es programarlo mediante puro código ASP, y eso es lo que he hecho.

Requerimientos

xelUpload es el nombre de una clase de VBScript que presenta propiedades y métodos para manejar el envío de ficheros al servidor. Su único requerimiento es disponer de la versión 5 o superior del motor de script. Para ver qué versión tienes disponible, puedes escribir:

Response.Write ScriptEngineMajorVersion

Si ves un 5, todo es correcto. Si no, puedes descargar gratis la última versión desde el sitio de Microsoft sobre script, o instalar Internet Explorer 5 o superior, que la incluye entre sus ficheros.

Por si no lo sabíais, para que el fichero llegue correctamente al servidor, tenemos que añadir un atributo más a la marca FORM, el que especifica la codificación del formulario al enviarlo, y nos permite subir datos binarios, así:

<form action="pagina.asp" method="post" enctype="multipart/form-data">

Cómo se usa

¿Cómo funciona xelUpload? Lo primero que tenemos que hacer es incluir el fichero, mediante:

<!--#include file="xelupload.asp"-->

si está el mismo directorio o

<!--#include virtual="/includes/xelupload.asp"-->

si está en otra ruta virtual, en este caso, en /includes/.

Después, debemos crear una instancia del objeto, y llamar al método Upload para comenzar el proceso en la página que recibe el formulario.


<%
Dim objUpload
objUpload.Upload()

%>

El objeto xelUpload, una vez llamado su método Upload, guardará los ficheros enviados con el formulario en la colección Ficheros, y los campos de texto normales en la colección eltosForm. La primera contiene objetos de tipo Fichero, que es otra clase que también incluyo, y a los elementos de la segunda se puede acceder con objUpload.Form("campo"), que es bastante familiar. ;-)

Para saber el número de ficheros subidos correctamente, podemos utilizar:

Response.Write objUpload.Ficheros.Count & " ficheros subidos."

Para acceder a las propiedades y métodos de cada Fichero subido, podemos recorrer la colección, o bien acceder directamente a uno, con el nombre del campo INPUT que tuviera el formulario:


Dim objUpload, objFichero
objUpload.Upload()

'si teníamos <input type="file" name="imagen">
set objFichero = objUpload.Ficheros("imagen")

'recorremos todos:
for each objFichero in objUpload.Ficheros.Items
	...
next

NOTA: El fichero ZIP con el código, documentación y un ejemplo está disponible al final del artículo, en la siguiente página.

Propiedades y métodos

Para ver en detalle qué podemos hacer con los ficheros una vez subidos, veamos qué nos ofrece la clase xelUpload y la clase Fichero, respectivamente:

xelUpload
Propiedades
Form(nombrecontrol) Devuelve el campo del formulario de nombre "nombrecontrol". Equivale completamente a Request.Form(nombrecontrol).
Métodos
Upload Realiza el proceso de recepción del formulario y almacena los resultados. Es imprescindible llamar a este método antes de acceder a las demás propiedades o colecciones del objeto xelUpload.
Colecciones
Ficheros Contiene una colección de objetos Fichero, uno por cada fichero enviado correctamente desde el formulario.
Fichero
Propiedades
Nombre Devuelve el nombre original del fichero, sin la ruta en el disco del usuario. Por ejemplo, mickeymouse.gif.
Tamano Devuelve el tamaño en bytes del fichero.
TipoContenido Devuelve el tipo de contenido del fichero en una cadena, si es reconocido por el servidor, o bien "application/octet-stream". Por ejemplo, para la imagen anterior, devolvería "image/gif".
Datos Devuelve los datos binarios puros del fichero.
Métodos
Guardar ruta Salva el fichero en disco en el servidor, con el nombre original, en la ruta pasada como argumento. Debe ser una ruta física, no virtual, así que probablemente utilizaremos Server.MapPath, así:
objFichero.Guardar (Server.MapPath("\upload"))
GuardarComo nombre, ruta Salva el fichero en disco, con el nombre especificado, en la ruta especificada. El nombre debe ser un nombre de fichero válido y la ruta, una ruta física.
GuardarBD objFld Guarda el contenido del fichero en el objeto Field de ADO pasado como argumento. Más abajo os explico cómo hacer esto.

Como véis, la interfaz es bastante flexible. Como siempre, todo esto se ve mejor con un ejemplo, así que vamos a ello.

Supongamos que enviamos un formulario como este:


<form action="pagina.asp" method="post" enctype="multipart/form-data">
Nombre: <input type="text" name="usuario" size="20"><br>
Edad: <input type="text" name="edad" size="5"><br>
<input type="file" name="imagen"><br>
<input type="submit" value="Enviar">
</form>

En la página que lo recibe y que hemos especificado en el atributo ACTION, pagina.asp, utilizamos nuestro superpoderoso y versátil xelUpload (se nota que estoy contento, ¿eh?) para ver el tipo de fichero que nos envía y su tamaño. Si es una imagen GIF y no supera los 15k (15*1024 bytes), la guardamos en dos directorios distintos (vale, esto no será muy normal, pero tengo que ilustrar los métodos) y en una base de datos, en una hipotética tabla usuarios que guarda (¿puedes imaginarlo?) el nombre, la edad, y una imagen GIF (supuestamente del usuario, aunque en GIF y menos de 15k... ¡ejem!).

No vamos a guardar sólo el nombre del fichero: vamos a guardar la imagen completa en una base de datos Access. ¿No sabéis cómo? Seguid, seguid...

Página siguiente

>> ¿Quieres saber cuándo se publicarán nuevos artículos? ¡Suscríbete al Boletín de ASPFácil! << 
>> Comparte tus dudas y comentarios sobre este artículo en el foro Artículos de ASPFácil << 
(Arriba)

© ASP Fácil 2000-2004 excepto en casos indicados
El mejor alojamiento web en acens