Bueno, salvo la mejor opinión de
Muzztein lo de la carpeta fuera del servidor es para asegurarse que alguien que se sepa la ruta no pueda brincarse la aplicación, no es indispensable si implementas un archivo "genérico" ya que la ruta no saldría en la barra de direcciónes, pero por mayor seguridad mejor pregúntale a tu host si tienes la posibilidad de colocar archivos fuera, lo del doble punto para hacer referencia rutas relativas, casi seguro que lo han deshabilitado.
El punto dos, si tienes que trabajar con tu carpeta dentro de raíz del sitio ya no aplica, la idea puediera ser algo como esto:
Código ASP:
Ver original<%
...... validaciones de seguridad y todo eso
Response.Buffer = True
Dim strFilePath, strFileSize, strFileName
Const adTypeBinary = 1
vFile = Request.QueryString("Id")
..... buscas ese ID en alguna tabla
strFilePath = rs("Path")
strFileSize = rs("Size")
strFileName = rs("FileName")
Response.Clear
Set objStream = Server.CreateObject("ADODB.Stream")
objStream.Open
objStream.Type = adTypeBinary
objStream.LoadFromFile strFilePath
strFileType = lcase(Right(strFileName, 4))
Select Case strFileType
Case ".asf"
ContentType = "video/x-ms-asf"
Case ".avi"
ContentType = "video/avi"
Case ".txt"
ContentType = "text/plain"
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 ".pdf"
ContentType = "application/pdf"
Case Else
'Handle All Other Files
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
%>
Saludos