Descargar archivo automáticamente desde PHP – Lanzar descarga

Bienvenidos a Ver Tutoriales.com, en esta ocasión os traigo un código en PHP para descargar archivos de nuestro servidor automáticamente sin que el usuario la lance.  Solo para que acepte.

Hay ocasiones en las que queremos que despues de hacer un listado, o sacar un reporte queremos que el archivo generado sea descargado por el usuario, para ahorrarnos el paso de que el propio usuario tenga que linkar al archivo, podemos facilitarselo lanzando la descarga automáticamente.

Así que veamos el código que os preparé en PHP:

$basefichero = basename(“tutorial.txt”);

header( “Content-Type: application/octet-stream”);
header( “Content-Length: “.filesize(“tutorial.txt”));
header( “Content-Disposition: attachment; filename=”.$basefichero.””);
readfile(“tutorial.txt”);

Esas 5 lineas de código son las necesarias para lanzar la descarga del fichero, en este caso tutorial.txt, pero vamos a hacerle unos arreglos y meterlo en una función para reutilizarla cambiando el archivo.

Veamos como quedaría:

function DescargarArchivo($fichero){

$basefichero = basename($fichero);

header( “Content-Type: application/octet-stream”);

header( “Content-Length: “.filesize($fichero));

header( “Content-Disposition:attachment;filename=” .$basefichero.””);
readfile($fichero);
}

Como podeis ver en la función DescargarArchivo, el contenido es practicamente igual a diferencia de que el valor del archivo a descargar ha sido modificado por una variable, en este caso $fichero, es el valor que recibe la función DescargarArchivo y que será utilizada a lo largo de la función. Mucho más comodo para reutilizarse si vais a tener que descargar varios archivos dentro de una misma aplicación.
Pues nada más! espero que descargueis vuestros archivos automáticamente con este código PHP para facilitar el trabajo a los usuarios.
Ya sabeis que si teneis alguna duda podeis dejar comentarios y os lo contestaré gustosamente.

Un saludo!

Te puede interesar:

44 comentarios

  • RDIAZ commented on 14 junio, 2010 Reply

    Hola,
    Estoy utilizando el codigo que compartes pero no logro hacer que funcione…
    La duda es si tu variable $fichero contiene toda la ruta de tu archivo? (“http://www.tusitio.com/carpetadescarga/archivo.zip”) o solo el nombre del archivo? lo he intantado de las dos formas y me descarga archivos de 1kb o de 428kb con el mismo nombre pero no es el original. Que estoy haciendo mal?

    Gracias.

    • VideoTutoriales commented on 14 junio, 2010 Reply

      Buenas RDiaz,

      Con respecto a tu duda, la ruta del fichero da igual si es absoluta o relativa, es decir, si pones “http://www.tutoriales.com/carpeta/archivo.zip”, que si pones, “./../video-tutorial.rar”.

      En el primer caso se le daría exactamente el lugar desde la raiz del dominio, y en el segundo caso accederíamos al directorio superior desde donde estamos ejecutando el script de descarga.

      Como consejo, si vas a utilizar varias llamandas para descargar, sería mejor poner la dirección absoluta. Además si de paso vas a ponerle urls amigables, sería necesario tambien la url absoluta.

      El que te descargue archivos más o menos pequeños no sé a que se debe. Pero se me ocurre que si estás generando el archivo en el momento, es posible que no le dé tiempo a crear el archivo completamente y lances la descarga antes de que esté completada la generación del archivo.

      Espero que le des solución.

      Un saludo!

  • pancho commented on 3 agosto, 2010 Reply

    no da solucion porque no sirve

    • VideoTutoriales commented on 4 agosto, 2010 Reply

      ¿Que problema te dá?

      Algo has de estar haciendo mal 🙂 Por que ese código está en producción en algún proyecto propio.

      Si me cuentas te ayudo 🙂

  • Jorge Andres commented on 9 septiembre, 2010 Reply

    Hola Amigos, tengo una url que me muestra un pdf y necesitaria saber como puedo hacer para que este pdf se baje automaticamente a un alchivo, lo ideal seria que se imprima pero con que se baje solo a un archivo si que tenga que ir a clickear en la opcion guardar.

    Un saludo grande y desde ya gracias.

    • VideoTutoriales commented on 11 septiembre, 2010 Reply

      Buenas Jorge,

      Siento decirte que esa opción la desconozco, supongo que lo que quieres es que una vez que seleccione la descarga del archivo, si es un pdf, en vez de que se abra desde el navegador se descargue directamente, creo que esa opción es más del navegador que del propio código html.

      La descarga de una archivo se hace linkando directamente a él con un enlace estandar, pero en este caso, el archivo se abre al ser pdf. Desconozco si hay alguna manera, si la hubiera no dudes que la expondré más adelante, tambien te pediría que si la encuentras la expliques para los que como tú tendrán la misma duda.

      Gracias de antemano!

      Un saludo!

      P.D. ¿Tal vez con JavaScript?

  • Marco Gamboa commented on 23 noviembre, 2010 Reply

    hola,

    buscando… buscando…. por google me aparecio tu pagina, soy muy novato con esto de PHP y estoy hacien un proteyecto en el cual se generan archivos PDF y deben guardarce en el servidor automaticamnete…

    mi problema: no puedo hacer que se guarden automaticamente … puedo generar el PDF pero no puedo guardo en el servidor… tiene un codigo o algo que me pueda ayudar, acepto cualquier idea 😀 de como guardar un PDF en forma automatica en el servidor 😀

    • VideoTutoriales commented on 25 noviembre, 2010 Reply

      Buenas Marco,

      Si ya eres capaz de generar el archivo, lo único que tendrás que hacer es guardarlo, el problema es posible que no sea de PHP sino de permisos de escritura en el servidor.

      Prueba a darle permisos a la carpeta donde estás guardando el fichero. Una vez descartada esta solución, tantearemos otras.

      Un saludete

  • Mike commented on 14 junio, 2011 Reply

    Hola, yo ya tengo un generador de reportes excel que funciona bien. Uso “\t” y “\n” para las tabulaciones y vueltas de carro respectivamente. El problema es que guarda el excel en el servidor aparte de permitir descargarlo. No me sirve el header() porque me lanza el error: “Cannot modify header information – headers already sent by… nombre del archivo”. Ya intenté todo para corregirlo pero no voy a poder cambiarle el ANSI dentro del servidor de produccion.

    Actualmente funciona con fopen() y fclose(), por lo que lo más lógico sería usar el unlink() para borrarlo. Lo he intentado con: ?action=eliminar&”.$ruta.” dentro del enlace. Lo recupero con if($_GET[‘action’] == eliminar) unlink($ruta); pero tampoco funciona. Me genera un segundo archivo, no me permite descargar ninguno y sólo se borra el segundo.

    ¿Qué estoy haciendo mal? El armado del archivo es muy complejo y no tengo tiempo ahorita para cambiarlo y hacerlo con tablas o buscarle con lo de header().

    • VideoTutoriales commented on 14 junio, 2011 Reply

      Buenas Mike, cual es el problema exactamente? que no puedes borrarlo? que no puedes descargarlo?

      El error que te dice, prueba a solo poner el código de descarga en la página. Con respecto al eliminar de unlink puedes ver el tutorial que preparamos en VerTutoriales.

      Un saludo!

  • Karla commented on 30 diciembre, 2011 Reply

    Hola lo que tengo que hacer es que en una pagina tengo q introducir ciertos parametros para asi generar un reporte y este rporte descargarlo(el reporte es un archivo excel).

    Mi aplicacion tiene q hacer esto autmaticamente definir los parametros, descargar el archivo y guardarlo, no se si es posible hacer esto o como cres que odria relizarlo.

    Saludos

    • VideoTutoriales commented on 31 diciembre, 2011 Reply

      Buenas Karla

      Claro que es posible, lo primero es generar el reporte en excel, luego una vez que tengas el archivo, simplemente es utilizar el código expuesto en este tutorial.

      Si necesitas ayuda, estamos por aquí.

      Un saludo!

  • chulas commented on 18 mayo, 2012 Reply

    hola queria saber donde colocas ese codigo…pues veras yo quiero hacer que se descargue un .exe pero no se donde poner el codigo me podrias ayudar

    • VideoTutoriales commented on 19 mayo, 2012 Reply

      Create un nuevo documento y copia ese código.

      Luego solo tendrás que llamar a ese archivo cuando quieras descargar el fichero.

  • jomaac commented on 13 agosto, 2012 Reply

    En windows me funciona perfecto, pero cuando lo publico en el servidor que tiene Linux, no forza la descarga sino que me muestra el contenido del archivo en la pagina.

    Gracias.

    • VideoTutoriales commented on 13 agosto, 2012 Reply

      Eso es por la configuración de tu navegador, dependerá del tipo de fichero, es como al pulsar sobre una imagen, algunos te pone en descarga la imagen y otros te la abren en el navegador. Buscaré algo al respecto, pero si cambias el tipo de fichero forzará la descarga sin problema. Cambia la extensión si fuera posible.

      Un saludo!

  • gustavo commented on 1 marzo, 2013 Reply

    hola , estoy usando Header para forzar la descarga de un archivo del servidor, pero necesito saber si existe alguna forma de obtener la direccion(path)donde el usuario descargará finalmente ese archivo.Gracias de antemano.

    • VideoTutoriales commented on 1 marzo, 2013 Reply

      Esa parte está en el lado cliente y sería una falla de seguridad. ¿Te imaginas poder acceder al árbol de archivos del cliente? 🙂

  • walter commented on 4 marzo, 2013 Reply

    Hola.

    He utilizado ese metodo para bajarme un archivo .jar de instalacion, de una aplicación java swing y lo hace; sin embargo, luego de bajarlo lo ejecuto y me da un mensaje de error diciendome que el archivo está corrupto. Lo probé tambien desde el localhost de mi maquina y salio lo mismo. Por otro lado probe el archivo de instalacion original y si funciona… Sabes que podria estar pasando.. ?

    Gracias

    • VideoTutoriales commented on 4 marzo, 2013 Reply

      Pues no debería de darte ningún tipo de problema, entiendo que el fichero que descargas automáticamente debería de funcionarte sin problema. Prueba a comprimirlo en rar o zip y vuelve a lanzarlo así, a ver si por algún motivo el fichero queda mal al subirse o bajarse (lo cual sería extrañísimo).

      Salud!

  • LUZ MARIA commented on 18 abril, 2013 Reply

    Hola quiero saber como descargar un archivo que sea .apk para ser instalado en disposiitvos que sean Android desde un sitio Web, es que en mi sitio pondre un boton de descarga pero no se como hacer que me descargue un archivo apk que se encuentra en la maquina, espero tu respuesta gracias

    • VideoTutoriales commented on 18 abril, 2013 Reply

      Pues nunca he probado a hacerlo, pero entiendo que será una descarga como otra cualquiera, tendrás que poner un link enlazando al fichero y el sistema tendrá que saber exactamente qué hacer con él 🙂

      Siento no poder darte otra información, pero no he trabajado de esa manera 🙂

  • Stefanie commented on 23 abril, 2013 Reply

    Hola!
    He probado este código, pero al descargar el archivo (tanto pdf como docx) me dice que está dañado y que no puede repararse. He intentado de mil maneras, pero no sé que puede estar mal, espero puedan ayudarme, muchas gracias,

    saludos!

    • VideoTutoriales commented on 23 abril, 2013 Reply

      Si te da problemas, quizás la solución sea comprimir el fichero en rar o zip para lanzar la descarga comprimida. He notado que a más de un usuario le da problemas, en mi caso no he tenido tal problema.

      Recordad que el código es PHP, aunque los heads son propios de HTML5 lo cual podréis probar sin que le paséis el parámetro por si necesitáis probar a pelo.

      Salud!

  • mariete commented on 26 abril, 2013 Reply

    Me aparecen 3 warning y no me descarga el archivo.
    Los warning dicen asi: “Cannot modify header information – headers alrady sent by (output started at…

    Entiendo lo que dicen los warning pero no se me ocurre como arreglarlo.

    Muchas gracias de antemano!

    • VideoTutoriales commented on 26 abril, 2013 Reply

      Buenas Mariete

      Al ser código de “Header” tienes que ponerlo al principio del código, prueba a colocarlo antes de poner ningún código. Sino te funciona, pega exactamente los mensajes que te pone, por lo que has pegado creo que es ese el problema.

      Ya me cuentas. Salud!

  • mariete commented on 26 abril, 2013 Reply

    he puesto el código al principio del todo como me has dicho y se me abre el pdf pero al cargar la pagina. lo que quiero es que se lance la descarga al final después de haber rellenado un formulario.

  • mariete commented on 26 abril, 2013 Reply

    A grandes rasgos este sería el código:

    …$mensaje.= “\nNombre: “. $_POST[‘nombre’];
    $mensaje.= “\nApellidos: “. $_POST[‘apellidos’];
    $mensaje.= “\nCentro: “. $_POST[‘centro’];
    $mensaje.= “\nCargo: “. $_POST[‘cargo’];
    $mensaje.= “\nEmail: “.$_POST[‘email’];
    $mensaje.= “\nTelefono: “. $_POST[‘telefono’];
    $destino= “prueba@prueba.com”;
    $remitente = $_POST[‘email’];
    $asunto = “Mensaje enviado por: “.$_POST[‘nombre’];
    mail($destino,$asunto,$mensaje,”FROM: $remitente”);
    ?>
    Mensaje enviado.
    <?php
    sleep(6);
    ///////////////AQUI ES DONDE QUIERO QUE SE ABRA/////////////////
    echo 'window.close();’;
    }
    ?>

    • VideoTutoriales commented on 26 abril, 2013 Reply

      Creo que lo más sencillo sería darle la vuelta al código, es decir, envías el pdf y luego se guarda el mensaje, a no ser que el pdf se rellene a tiempo real con los datos del formulario, si fuera ese el caso, tendrías que guardar los datos en la base de datos y una vez guardado enviar a otra página donde ya cargue el resto.

      Si me das un poco más de información con respecto a lo que quieres hacer, te podría dar una idea más concreta 😉

  • angelo commented on 20 agosto, 2013 Reply

    hola amigo como te va, sabes que estoy trabajando con un generador de excel que hicimos en mi equipo, tiene mucha similitud a lo que tu muestras en el tutorial, ademas que hace lo mismo, hace la descarga de inmediato, de igual forma mi aplicación tambien envía el reporte por correo (en el cuerpo del correo)eso tambien esta perfecto. no obstante hay un nuevo requerimiento, el cual es que se envie el correo pero con el doc excel adjunto, he estado investigando y a según el archivo se debe guardar en el servidor temporalmente para agregarlo a una variable e incluir esa variable en el cuerpo del generador de correo de php. la cosa es que para empezar, no se como hacer para guardar el archivo automáticamente en el servidor

    • VideoTutoriales commented on 20 agosto, 2013 Reply

      Buenas tardes
      Entiendo que si has mandado a descargar el fichero, es por que ese fichero ya existe en el servidor, sino no puede ser descargado.

      Con respecto al tema del mail, lo que quieres es poder adjuntar ese mismo fichero, para ello te remito a otro tutorial que tiene el código necesario para enviar el fichero adjunto con la función mail de php (Aquí)

      Espero que te sea de utilidad.
      Un saludo!

  • InformaticosGB commented on 25 febrero, 2015 Reply

    Excelente, funciona. Muchas gracias 🙂

  • ramon commented on 12 noviembre, 2015 Reply

    Hola una pregunta, estoy usando ExtJs y uso ajax para llamar a el php
    Ext.Ajax.request({
    url : ‘../phpr/exportacion.php’,
    method: ‘POST’,
    params: {

    table: getParams().split(‘=’)[1],
    },
    success : function(response, opts){

    console.log(response.responseText);

    }

    en el exportacion.php tengo el codigo pero no descarga nada

    • Carlos Dk commented on 13 noviembre, 2015 Reply

      Posiblemente al hacer la llamada desde ajax este lo realice “por detrás” que es como realmente funcionan las llamadas AJAX, así que posiblemente esté dando la respuesta pero por eso no lance la descarga. Puedes probar a abrir el exportacion.php en un popup javascript y enviar la señal de cerrado cuando compruebes que el fichero está descargado.

      Espero que te sirva 🙂

  • Alfredo Morales commented on 1 marzo, 2016 Reply

    Gracias!!!!

    Me srivió de maravilla

  • Carito commented on 16 agosto, 2016 Reply

    Hola, yo tengo un archivo en mi pc y necesito adjuntarlo a un correo, pero no como archivo adjunto, sino que como un link que al pincharlo, descargue automaticamente ese archivo.

    Alguien puede ayudarme u orientarme

    Gracias

    • Carlos Dk commented on 22 agosto, 2016 Reply

      Carito, necesitarás subirlo a un servidor accesible y luego simplemente enlazarlo. Es como crear un hipervínculo pero en este caso a un fichero. No tiene más 😉

  • carito commented on 25 agosto, 2016 Reply

    Gracias Carlos 🙂 empezaré a ver servidores y cualquier cosa te cuento

    • Carlos Dk commented on 26 agosto, 2016 Reply

      Ok, por aquí me tienes para cualquier cosa 😉

  • carito commented on 26 agosto, 2016 Reply

    Aqui estoy otra vez >-< te cuento que encontré esta pagina que es super buena http://www.hipload.com/
    pero el problema es que al momento de adjuntar el link al correo, me envia a la misma pagina para descargar el archivo, y lo que yo necesito es que lo descargue automaticamente al pinchar el link….
    hay alguna solucion para eso?
    🙂

  • Julian Collazos commented on 13 enero, 2017 Reply

    Hola, tengo un problema, quiero descargar un reporte en varios formatos, txt pdf y xls, la cuestion es que el usuario si lo desea puede descargar el archivo en los tres formatos al tiempo. En ese caso primero descarga el formato en txt pero cuando lo debe hacer a pdf es como si se terminara la ejecucion del programa y no hace mas.

    Agradezco si conocen alguna solucion.

    • Carlos Dk commented on 13 enero, 2017 Reply

      No llego a entenderte, ¿pero por qué no haces un paquete zip y los descargas todos juntos?

Deja un comentario

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