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!



12 Respuestas
RDIAZ
junio 14th, 2010 a 6:39 pm
1Hola,
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
junio 14th, 2010 a 10:31 pm
2Buenas 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
agosto 3rd, 2010 a 10:59 pm
3no da solucion porque no sirve
VideoTutoriales
agosto 4th, 2010 a 9:17 am
4¿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
septiembre 9th, 2010 a 10:37 pm
5Hola 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
septiembre 11th, 2010 a 1:45 am
6Buenas 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
noviembre 23rd, 2010 a 8:53 pm
7hola,
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
noviembre 25th, 2010 a 7:22 pm
8Buenas 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
junio 14th, 2011 a 10:09 pm
9Hola, 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
junio 14th, 2011 a 10:36 pm
10Buenas 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
diciembre 30th, 2011 a 7:58 pm
11Hola 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
diciembre 31st, 2011 a 10:28 am
12Buenas 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!
Insertar al RSS los comentarios de esta entrada
Escribe tu comentario