Cita:
Iniciado por Al Zuwaga
Supongo yo que la carpeta download está al mismo nivel que el root de tu sitio. Pero no es el enlace html quien accede al archivo ubicado en esa carpeta sino el script que tenés en download.asp. Creo que con esto quedaría demostrado que el <a href="carpeta_al_mismo_nivel_del_root/archivo.ext"> no funciona

Efectivamente, la carpeta download está al mismo nivel que el root. Hace 2 años que lo monté y la verdad es que no recordaba si era link directo o no. Y efectivamente, no es un link directo. Se accede al fichero a través de ese script que hay en download.asp, y el cual fuerza la descarga del fichero (al menos muestra la ventana de abrir/descargar, para que el usuario elija, e impedir que se cargue directamente en pantalla el fichero, si se trata por ejemplo de una imagen, un pdf, o un doc, por poner tres ejemplos).
Acabo de revisar todo, y he probado con otro ejemplo más sencillo. Créate una carpeta llamada <descargas>, al mismo nivel de tu root, y mete dentro un fichero llamado
ejemplo.zip
Ahora en una página llamada
prueba.html, y que cuelga del root directamente pones solo este link a otro fichero llamado bajarficheros.asp:
Código:
<a href="bajarficheros.asp?fichero=../descargas/ejemplo.zip&Nombre=Al-Zuwaga.zip&Tamanio=20000">descargar</a>
Explicación de las variables:
fichero = nombre original del archivo.
nombre = nuevo nombre con el que queremos descargar el fichero.
tamanio = tamaño del fichero (para informar en la ventana cuando se descarga, y saber el tiempo estimado de la descarga).
Ahora en el fichero llamado
bajarficheros.asp, que está en el root colgando directamente de él, coloca este código:
Código:
<%
Response.Buffer=True
Dim strFilePath, strFileSize, strFileName
Const adTypeBinary = 1
strFilePath = Request.QueryString("Fichero")
strFileSize = Request.QueryString("Tamanio")
strFileName = Request.QueryString("Nombre")
Response.Clear
'*******************************
' Requiere MDAC 2.5 o superior
'*******************************
Set objStream = Server.CreateObject("ADODB.Stream")
objStream.Open
objStream.Type = adTypeBinary
objStream.LoadFromFile Server.MapPath(strFilePath)
strFileType = lcase(Right(strFileName, 4))
'Se pueden añadir otros Content-Types de ficheros, aquí
Select Case strFileType
Case ".asf"
ContentType = "video/x-ms-asf"
Case ".avi"
ContentType = "video/avi"
Case ".doc"
ContentType = "application/msword"
Case ".zip"
ContentType = "application/zip"
Case ".xls"
ContentType = "application/vnd.ms-excel"
Case ".gif"
ContentType = "image/gif"
Case ".jpg", "jpeg"
ContentType = "image/jpeg"
Case ".wav"
ContentType = "audio/wav"
Case ".mp3"
ContentType = "audio/mpeg3"
Case ".mpg", "mpeg"
ContentType = "video/mpeg"
Case ".rtf"
ContentType = "application/rtf"
Case ".htm", "html"
ContentType = "text/html"
Case ".asp"
ContentType = "text/asp"
Case Else
'Otros ficheros
ContentType = "application/octet-stream"
End Select
Response.AddHeader "Content-Disposition", "attachment; filename=" & strFileName
Response.AddHeader "Content-Length", strFileSize
Response.Charset = "UTF-8"
Response.ContentType = ContentType
Response.BinaryWrite objStream.Read
Response.Flush
objStream.Close
Set objStream = Nothing
%>
Luego cliquea en el enlace, y te forzará la descarga del fichero que tienes en la carpeta <descargas>, y al que le cambiará el nombre, poniéndole Al-Zuwaga.zip (pese a llamarse realmente ejemplo.zip).
Cita:
Iniciado por Al Zuwaga
Si le paso por mail a un amigo esa dirección (que contiene un documento supersecreto

que sólo debe ser descargado desde tu sitio) lo podrá bajar haciendo click en el enlace o copiando y pegándolo en la barra de direcciones de su browser. Se me ocurre que deberías verificar que el referer no sea nulo ni distinto a tu dominio para asegurar la cosa.
Sí, claro que podrá descargarlo, porque son ficheros públicos, y de secreto tienen poco

.
Si no quieres que tu amigo se los baje, simplemente en el fichero
bajarficheros.asp, antes de ese código, controlas si tiene su sesión como usuario validado (o su cookie, si lo prefieres) -para el caso de que sea un usuario registrado/validado quien solo pueda bajarse el fichero-, y si no lo tiene, pues no ejecutas el código, y lo redireccionas al index, por ejemplo:
Código:
<%if session("usuariovalidado") = true then
'aquí viene el código anterior para forzar la descarga del fichero
else
response.redirect "index.asp"
end if
%>
Salu2 master.
PD1: Edito para comentar, que si no quieres pasar por el querystring el nombre de la carpeta (en el ejemplo: descargas), puedes omitirlo, pasando solo el nombre del fichero (ejemplo.zip). En este caso, en la página bajarficheros.asp, solo tienes que concatenar el nombre de la ruta y el fichero así:
strFilePath = "../descargas/" & request.querystring("fichero")
Y así ya tienes la carpeta oculta ocultísima, y aunque se vea el nombre del fichero en el enlace, da igual, porque nadie sabe en qué carpeta está (y si a la carpeta la llamas "laabuelafumamaria", seguro que nadie da con ella

).
PD2: En el fichero bajarficheros.asp, puedes implemenetar más cosas, como sumar 1 hit a las descargas que haya, etc.