Forzar la descarga de archivos en nuestros Sitios Web

En algunos casos (comúnmente una página de descargas), nosotros necesitamos forzar a que el usuario descargue los archivos. Pero hay un problema, hay tipos MIME conocidos por los navegadores como las imágenes y los archivos HTML, entre otros, y que el navegador ya sabe como manipular estos archivos, pero que pasa si yo quiero forzar la descarga de estos archivos, por ejemplo en un repositorio de imágenes, o por cualquier otra razón queremos que descargue los archivos html, de texto, entre otros:

Para poder lograr esto vamos a hacer uso de la cabecera (header) Content-Disposition, de HTTP 1.1. Y lo que vamos hacer es que, cuando hagamos el response al usuario asignemos al header «Content-Disposition«, el valor de «attachment; filename=tuArchivo.ext«, y esto es independiente de que tipo de archivo sea, ya sea un MIME conocido o no. Además que es propio del protocolo HTTP, e independiente del lenguaje en que se use, se puede usar con aspphp, jsp, y los demás tecnologías de servidor, claro siempre y cuando permita modificar el header en el response.

Pero vamos a lo nuestro, como hacemos esto en ASP.NET, en primer lugar tendremos una página donde estén listadas las descargas, y una página separada para gestionar las descargas, filedownload.aspx, dentro de esta página colocaremos el siguiente código:

protected void Page_Load(object sender, EventArgs e)
{
   string filename = Request.QueryString.Get(«FileName»);

   if ( !String.IsNullOrEmpty(filename) )
   { 
      String dlDir = @»Descargas/»
      String path = Server.MapPath(dlDir + filename);

      System.IO.FileInfo toDownload =
                   new System.IO.FileInfo(path);

      if (toDownload.Exists)
      {
         Response.Clear(); 
         Response.AddHeader(«Content-Disposition»,
                    «attachment; filename=» + toDownload.Name);
         Response.AddHeader(«Content-Length»,
                    toDownload.Length.ToString());
         Response.ContentType = «application/octet-stream»
         Response.WriteFile(dlDir + filename);
         Response.End();
      } 
   }
}

Obviamente que en la página de descarga, cada link de descarga tendrá referencia a esta última página con el nombre del archivo de descarga.

También pueden visitar:

Saludos,

Post cruzado 3Dev Blogs

21 comentarios sobre “Forzar la descarga de archivos en nuestros Sitios Web”

  1. En algunos casos (comúnmente una página de descargas), nosotros necesitamos forzar a que el usuario descargue los archivos. Pero hay un problema, hay tipos MIME conocidos por los navegadores como las imágenes y los archivos HTML, entre otros, y que el

  2. En algunos casos (comúnmente una página de descargas), nosotros necesitamos forzar a que el usuario descargue los archivos. Pero hay un problema, hay tipos MIME conocidos por los navegadores como las imágenes y los archivos HTML, entre otros, y que el

  3. Buenas,

    El ejemplo me viene como anillo al dedo para lo que necesito hacer, pero no se cómo indicarle que me abrá el comento, en mi caso un pdf, en una ventana nueva.
    Se puede hacer eso???
    Gracias.

  4. Hola

    Sabes estoy desarrollando una pagina desde donde se puedan descargar diferentes archivos mutimedia, tengo el codigo casi igual al tuyo pero no me realiza la descarga, cuando descarga me descarga 0 bytes osea nada, tu sabes que puede ser, porfavor te agradeceria una respuesta.

    gracias!!

    adios!!

  5. Muchas gracias, ha sido complicado dar con las palabras clave para encontrar esto que buscaba.
    Realmente se agradece.

    Ya puestos, ¿sabéis cómo puedo saber si el usuario finalmente se ha descargado el archivo o ha cancelado su descarga?

    Un saludo.

  6. @Jorge, de nada.

    @Alejandro, pues puede ser problema en la generación del archivo.

    @Franklin, puedes habilitar el listado de directorios para esa carpeta, pero si no quieres habilitar eso, tendrías que usar System.IO para listar todos los archivos disponibles.

    @Javier, pues se debe poder, pero hay que hacer más código adicional, que interactue con el request, salvo que por ahí haya un artificio. Podemos preguntar en el foro, para ver si tienen una sugerencia: http://forums.microsoft.com/MSDN-ES/default.aspx?ForumGroupID=85&SiteID=11. Quizás no vaya tanto por ASP.NEt, si no por el servidor Web, en el caso de asp.net IIS.

    Saludos,

  7. funciona perfecto en mi implementacion, pero me proceduce broncas cuando son archivos pesados, me manda el error:

    Aplicación de servidor no disponible

    habra alguna forma de solucionarlo,

    saludos y gracias

  8. Oye, y que diferencia hay si utilizo el server.binaryWrite….

    Lo que pasa es k estoy trabajando con archivos de posiblemente 100 mb o mas, o donde quizas un archivo d 10 mb sea descargado por varios usuarios al mismo tiempo…. entonces mi duda es como hacer para k el servidor no consuma mucha memoria al momento de empezar una descarga oesada como esta

  9. una consulta, y si el archivo que quiero descargar esta en otro servidor dentro de la misma red, cual sería la configuracion a utilizar, pues obtengo el siguiente error

    La cuenta a que se hace referencia está bloqueada y no se puede utilizar.

  10. tengo problemas a la hora de bajar el archivo, no baja la extencion(holamundo.jpg lo baja holamundo), esto solo ocurre con firefox 3.5, no tengo problemas con crome ni con explorer, y el problema es que a la hora de abrier el archivo descargado no sabe cual es la extencion.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *