[Indice]


El método Server.CreateObject

Server.CreateObject("ADODB.Stream")

Esta es otra interesante propiedad del objeto Server.CreateObject()   Un "stream", en inglés, es una corriente o flujo, en este caso de bits. Es decir, que podemos leer un fichero de forma binaria, lo que significa que se obtendrá completamente puro y sin cabeceras HTTP, que lo corromperían. Y puede que te preguntes por qué es necesario complicarse la vida con flujos de bits y demás historias, cuando para descargar un fichero lo podemos obtener simplemente mediante un link. Por ejemplo:

<a href="/gif/privado.gif">Obtener gráfico</a>

Pues en efecto, este sencillo método te puede resolver el problema, pero solamente lo hará si el fichero a descargar reside en un directorio que forma parte del árbol de tu web. Es decir, que el fichero está en el directorio raíz del web o en alguno colgado de él, como /gif   /graficos   o cualquier otro.

¿Qué hacer si el fichero no está en un directorio colgado de la raíz? Y puede que vuelvas a preguntarte: ¿Y por qué no lo va a estar? Pues simplemente porque no es un fichero público, es decir, que no queremos que lo vea cualquiera, sino aquellos usuarios que hayan pasado por una validación previa controlada por nuestra aplicación. Por supuesto, se puede controlar el acceso a un directorio (cuelgue o no de la raíz) creando usuarios autorizados directamente en el servidor, pero eso es muy pesado y poco práctico; imagina que estamos hablando de cientos, tal vez miles de usuarios. En estos casos la solución suele ser escribir una aplicación de registro de usuarios con una Base de Datos SQL Server o Access, y para evitar que algún "listo", que se ha enterado de la ruta donde estan los ficheros a proteger, llegue hasta ellos, se hace que se descarguen en binario desde un directorio situado fuera del árbol del web, con lo que podemos controlar fácilmente el acceso a los usuarios autorizados.

El siguiente programa extrae ficheros de un directorio llamado "privados" que está fuera del árbol del web, y será llamado por otro programa que, previamente, ha comprobado si el usuario tiene permiso de acceso o no, dando valor "si" a la variable de sesión Session("acceso"). Esta variable de sesión solamente existirá si la ha definido el programa llamador, por lo que si el usuario invoca directamente al programa llamado, no obtendrá el acceso deseado.

El programa llamador puede invocar al llamado de muchas formas. Una de las más simples puede ser un link o una lista de ellos:

<a href="binarios.asp?file=privado.gif">Obtener gráfico</a>

Y este sería el programa:  

binarios.asp

<%
'Primero se establece el tipo MIME del fichero para que el navegador sepa si lo puede mostrar
'directamente, tiene que usar un "plug-in" o llamar a otro programa

Select Case Right(Request.QueryString("file"), 3)
  Case "xls": Response.ContentType = "application/x-msexcel"
  Case "doc": Response.ContentType = "application/x-msword"
  Case "pps": Response.ContentType = "application/x-msppoint"   
  Case "pdf": Response.ContentType = "application/pdf"
  Case "gif": Response.ContentType = "image/gif"
  case "mp3": Response.ContentType = "application/x-mplayer2"
End Select


'Esto sirve para que el navegador del cliente  pregunte si lo abre o lo guarda en disco
Response.AddHeader "content-disposition","attachment; filename=" + Request.QueryString("file") 

'Aqui se comprueba que el acceso es autorizado por el programa llamador.
'Si es asi, se comienza la descarga
if Session("acceso") = "si" Then
   Const adTypeBinary = 1
   Dim RutaFichero

   RutaFichero = "c:\privados\" + Request.QueryString("file") 

   Set objStream = Server.CreateObject("ADODB.Stream")
   objStream.Open
   objStream.Type = adTypeBinary
   objStream.LoadFromFile RutaFichero

   Response.BinaryWrite objStream.Read

   objStream.Close
   Set objStream = Nothing
 Else
   Response.Write("<h2 align='center'>Acceso denegado</h2>")
End if
%>
Como puedes ver, es bastante sencillo. Fíjate en que el programa no tiene las típicas cabeceras de las páginas HTML como body, head, title, etc. Si las tuviese el fichero extraido llegaría con ellas y por tanto inutilizado.

Una cosa que no debes olvidar es que el programa tenga permiso de lectura en el directorio donde estén los ficheros.


[Indice]