Descargar cualquier archivo con ASP, FSO y el objeto ADODB Stream...

Publicado a las 11:46:49 en Programación (9)

Si tienen su sitio web hecho en ASP, y lo que desean es que se puedan descargar cualquier tipo de archivo, ya sea imagen, texto, etc, en lugar de abrirlo en el mismo navegador, este código les será de suma utilidad.

Lo necesitaba para un sistema de usuarios en el que estaba trabajando, en el cual, como algo opcional, se permitía que los usuarios pudieran incluir archivos en sus mensajes. El problema se presentó cuando, en lugar de descargarse, los archivos se abrían directamente en el navegador, como sucede con las imágenes y archivos de texto.

Pues bien, el código lo encontré en la web de xefteri.com, y quedó perfectamente. Para lograrlo, deberán utilizar el siguiente código:

download.asp [descargar el archivo aquí]


<%@Language="VBScript"%>
<%Option Explicit%>
<%Response.Buffer = True%>
<%
On Error Resume Next
Dim strPath
strPath = CStr(Request.QueryString("file"))
'-- do some basic error checking for the QueryString
If strPath = "" Then
  Response.Clear
  Response.Write("No file specified.")
  Response.End
ElseIf InStr(strPath, "..") > 0 Then
  Response.Clear
  Response.Write("Illegal folder location.")
  Response.End
ElseIf Len(strPath) > 1024 Then
  Response.Clear
  Response.Write("Folder path too long.")
  Response.End 
ElseIf Right(strPath,4) <> ".jpg" Then ' ...specify the file format(s) to allow download
   Response.Clear
   Response.Write("File extension not supported.")
   Response.End
 Else
  Call DownloadFile(strPath)
End If

Private Sub DownloadFile(file)
'--declare variables
Dim strAbsFile
Dim strFileExtension
Dim objFSO
Dim objFile
Dim objStream
'-- set absolute file location
strAbsFile = Server.MapPath(file)
'-- create FSO object to check if file exists and get properties
Set objFSO = Server.CreateObject("Scripting.FileSystemObject")
'-- check to see if the file exists
If objFSO.FileExists(strAbsFile) Then
Set objFile = objFSO.GetFile(strAbsFile)
'-- first clear the response, and then set the appropriate headers
Response.Clear
'-- the filename you give it will be the one that is shown
' to the users by default when they save
Response.AddHeader "Content-Disposition", "attachment; filename=" & objFile.Name
Response.AddHeader "Content-Length", objFile.Size
Response.ContentType = "application/octet-stream"
Set objStream = Server.CreateObject("ADODB.Stream")
objStream.Open
'-- set as binary
objStream.Type = 1
Response.CharSet = "UTF-8"
'-- load into the stream the file
objStream.LoadFromFile(strAbsFile)
'-- send the stream in the response
Response.BinaryWrite(objStream.Read)
objStream.Close
Set objStream = Nothing
Set objFile = Nothing
Else 'objFSO.FileExists(strAbsFile)
Response.Clear
Response.Write("No such file exists.")
End If
Set objFSO = Nothing
End Sub
%>


Postariormente, para poder utilizar el código, en el enlace correspondiente, colocarían lo siguiente:

<a href="download.asp?file=archivo.txt">

Con eso, lograrán que cada vez que se haga click en el enlace, en lugar de querer abrir directamente el archivo, aparezca una ventana que preguntará si se desea abrir o guardar el archivo.

Como ven, no es nada difícil de utilizar. Espero que les sea de utilidad.

 Actualización del 26 de Octubre del 2012:  He incluído unas líneas de código adicionales para que se pueda especificar la extensión (o extensiones) permitida para descargar. De esa forma, no podrán descargarse directamente nuestros archivos .ASP, que podrían contener información importante (como nombres de usuario y contraseñas de BD, por ejemplo).

Nota adicional: Para poder descargar archivos dentro de algún subdirectorio, es conveniente utilizar rutas "absolutas", ya sea "http://www.ejemplo.com/carpeta/archivo.txt" o "/carpeta/archivo.txt". Las rutas "relativas" del tipo "../carpeta/archivo.txt" no funcionarán.

Escrito por Phillipe en viernes, 28 de noviembre de 2008 | Comentarios (17)

Compartir: | | Más
  1. 1. Excelente, justo lo que estaba buscando.

    Gracias!!!

  2. 2. Sam: Me alegra que te haya sido de utilidad.

  3. 3. No funciona le pongo se cae

  4. 4. Carlos: ¿Qué es exactamente lo que no te funciona?

    Si deseas envíame un mensaje a través del formulario de contacto para ver si te puedo ayudar.

  5. 5. Muy útil el código! Ahora bien, para poder descargar un archivo desde otro directorio, sólo debe colocar la ruta del archivo en file=? Gracias.

  6. 6. Así­ es, Andrea.
    Cualquier consulta que tengas, me la haces saber.

  7. 7. Lo he intentado pero sin éxito! La página queda procesando unos segundos y finalmente da un error...

  8. 8. Detecté que el error está en el tipo de archivo que necesito descargar, que es .mdb.

  9. 9. Andrea: Por favor, envíame un mensaje a través del formulario de contacto, indicando exactamente el error que encuentras, para poder ayudarte mejor.

  10. 10. He actualizado un poco el código del archivo, así como el artículo en sí, en caso a alguien le interese.

  11. 11. No me funciona; me dice que tiene problemas de conexion.

  12. 12. Andres: Sería bueno que me envíes un mensaje con tu código para poder ayudarte mejor. Puedes hacerlo desde el formulario de contacto.

  13. 13. Me dice: Se han recibido encabezados duplicados desde el servidor

  14. 14. hola, probé el código sin embargo no me manda ningún error pero no hace nada, sabes la razón?

  15. 15. Hola, Patricia. Sería bueno que, para poder ayudarte mejor, me puedas mostrar el código que estás utilizando. Si deseas como comentario o a través del formulario de contacto del blog. :)

  16. 16. habrá algún método que funcione con archivos pesados??? porque con uno de 20MB se cae...

  17. 17. Pero si me funciona con archivos pequeños, con los grandes no... y solo puedo usar ASP =/

  18. Nombre
    URL
    Email
    La dirección de Email no se publicará
    Recordarme
    Comentarios

    CAPTCHA Recargar
    Escribe los caracteres en la imagen de arriba