Hola desconocido

Hora internet: @ 732

Upload de archivos

Permitirle al cliente subirle archivos al servidor es algo muy comun y cada vez mas necesario para que los sitios web sean mas dinámicos y configurables. Veremos una solucion rapida para realizar esta misión

Existen componentes para realizar la tarea (algunos muy buenos y recomendables) pero si no queremos hacer uso de ellos porque no siempre nuestro hosting permite instalarlos (algunas veces hay que pagar adicinonales), podemos hacer un upload por ASP PURO

Para el ejemplo, vamos a usar un script que lo pueden Descargar Aqui
El ZIP contiene 2 archivos.

freeASPUpload.asp Corazon del upload. Clase implementada con sus metodos y propiedades
(no hace falta que entendamos o miremos este archivo, salvo que nos interese, por supuesto)
PruebaUpload.asp Ejemplo de upload. (es el código que está aqui abajo)

En realidad el código de aqui abajo esta simplificado para explicar ahora un poco como se maneja el upload. El ejemplo que está en el ZIP para descargar está mas completo y mejor, pero para explicar por primera vez, creo mas fácil un ejemplo con menos cosas...

Explicacion en detalle del script (el ejemplo)

  • La primera línea importante del script es la linea del Include: <!-- #include file="freeaspupload.asp" --> la cual llama al archivo freeASPUpload.asp (que como dije antes, es el corazon de todo esto). Sin esta linea nada funcionará



  • Luego mas abajo hay un comentario que básicamente lo que dice es que hay que configurar el directorio de destino donde los archivos subidos van a quedar. Esto se hace en una variable que está justo alli, en el ejemplo se llama uploadsDirVar. (Leer el comentario. Habla sobre permisos de escritura, etc.)



  • Luego aparece una funcion llamada SaveFiles y es la que se encarga de efectuar la subida de los archivos. Es la funcion que deberemos llamar para hacer el upload (internamente digamos, esta funcion hace uso del archivo freeASPUpload.asp)



  • Explicacion dentro de la funcion. Hay dos lineas principales e imprescindibles:
    Set Upload = New FreeASPUpload
    Upload.Save(uploadsDirVar)

    La primer linea crea un objeto de la clase FreeASPUpload y la segunda llama al método Save, produciendo el upload de los archivos.


  • Luego restaría explicar un poco de HTML.
    El formulario tiene que ser asi: <FORM METHOD="POST" enctype="multipart/form-data">
    Y luego los campos de texto deben ser algo asi: <INPUT NAME="archivo1" TYPE="FILE">


  • Todo esto que estoy diciendo, está reflejado en el script de aqui abajo
  • <%
    option explicit
    Response.Expires = -1
    Server.ScriptTimeout = 600
    %>
    <!-- #include file="freeaspupload.asp" -->
    <%
    ' ****************************************************
    ' Cambiar el valor de la siguiente variable
    ' para indicar el directorio de destino.
    ' El directorio indicado debe tener permisos de escritura
    ' de caso contrario el script fallará mostrando un error.
    Dim uploadsDirVar
    uploadsDirVar = "C:\Inetpub\wwwroot\"
    ' ****************************************************

    Function SaveFiles
    Dim Upload, ks, resumen
    Set Upload = New FreeASPUpload
    Upload.Save(uploadsDirVar)
    If Err.Number <> 0 then Exit function
    ks = Upload.UploadedFiles.keys
    if (UBound(ks) = -1) then resumen = "No es un nombre valido en el sistema."
    SaveFiles = resumen
    end function
    %>


    <HTML>
    <HEAD><TITLE>Test Free ASP Upload</TITLE></HEAD>
    <BODY>
    <br>
    <div style="border-bottom: #A91905 2px solid;font-size:16">Subir archivos</div>
    <div style='margin-left:150'>

    <form name="frmSend" method="POST" enctype="multipart/form-data" action="pruebaupload.asp">
    Archivo 1: <input name="attach1" type="file" size="35"><br>
    Archivo 2: <input name="attach2" type="file" size="35"><br>
    <br>
    <input type=submit value="Upload">
    </form>
    <BR></div>
    <%
    'solo llamo al UPLOAD si hay envio de formulario
    if Request.ServerVariables("REQUEST_METHOD") = "POST" then
    response.write SaveFiles()
    end if
    %>
    </BODY> </HTML>

    Este ejemplo que manejamos aqui, es una "modificación" de su original, al cual le debemos las gracias. El sitio oficial es este: Free ASP Upload. Aqui hay una explicación (en ingles) del script y explica algunas cosas más.

    Queda mucho por decir... no se vayan...

    Por ejemplo que no podran hacer Request.Form("nombre") a un campo de texto que llamaron nombre dentro del mismo formulario... Eso se debe a que el formulario va enviado de otro modo. El atributo ENCTYPE del FORM envia los datos en otro formato digamos, impidiendo que el tipico Request() funcione
    Pero a no preocuparse, podran hacer exactamente lo mismo con la llamada a Upload.Form("nombre")

    Lamentablemente todo esto es bastante simple, pero carece de la posibilidad de guardar el archivo con un nombre diferente al que tiene. Cual es el problema? que se podrian subir archivos con el mismo nombre, y pisarse uno a otro. Un ejemplo facil seria una imagen que se llama "foto.jpg".
    La solucion que yo planteo a este problema, es que nunca dejemos los archivos con el nombre que los suben, y siempre renombrarlos a algo unico. Voy a poner un ejemplo.
    Supongamos estamos desarrollando una pagina de autos. y se pueden subir fotos de autos... Supuestamente esos "autos" son registros de una tabla de una base de datos, la cual siempre deberia tener un ID. entonces la foto subida se puede renombrar al numero de ID del "auto"... es decir.

    Como se renombra un archivo? ese es otro "problema" aparte que no tiene nada que ver con esto. Para eso existe el Objeto integrado en ASP FileSystemObject el cual maneja archivos y cosas relacionadas. De hecho pueden ver aqui un ejemplo sobre como renombrar un archivo

    Cualquier discusión o pregunta sobre este ejemplo, la pueden dejar en el foro de mensajes





    © SoloASP.com.ar - 2001 / 2005. Todos los derechos reservados. soloasp@soloasp.com.ar
    Buenos Aires - Argentina. Diseño web y programación por Guido Laghi