<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.