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!
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.
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!
no da solucion porque no sirve
¿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 🙂
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.
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?
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 😀
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
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().
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!
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
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!
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
Create un nuevo documento y copia ese código.
Luego solo tendrás que llamar a ese archivo cuando quieras descargar el fichero.
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.
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!
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.
Esa parte está en el lado cliente y sería una falla de seguridad. ¿Te imaginas poder acceder al árbol de archivos del cliente? 🙂
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
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!
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
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 🙂
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!
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!
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!
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!
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.
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();’;
}
?>
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 😉
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
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!
Excelente, funciona. Muchas gracias 🙂
Gracias a ti por comentar 😉
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
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 🙂
Gracias!!!!
Me srivió de maravilla
Gracias a tí!
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
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 😉
Gracias Carlos 🙂 empezaré a ver servidores y cualquier cosa te cuento
Ok, por aquí me tienes para cualquier cosa 😉
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?
🙂
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.
No llego a entenderte, ¿pero por qué no haces un paquete zip y los descargas todos juntos?
Hola, solo dar las gracias, esta perfecto.
Gracias por comentarlo! 🙂
Hola buenas tardes, yo genero un archivo .txt utilizo el codigo este y al darle al link de descarga no lo hace si no que me lo muestra el contenido en la pagina sin ningun formato, ya he probado con varios ejemplos y me hacen lo mismo, tienes idea de que pueda ser
Hola Buenas tardes, tengo un codigo parecido a el tuyo para descargar un TXT, y al darle click a descargar no me descarga me muestra el contenido del archivo en el explorador, sabras por casualidad a que se debe. el codigo me funcionaba con PHP5 y actualice a PHP7, y todo me funciona excepto esto. ya he probado con distintos ejemplos pero todos me dan el mismo resultado.
Buenas Danny, el código que comentas y que está en el artículo, está preparado para una versión anterior a PHP7, de hecho por la fecha que maneja, seguramente una versión 5 muy temprana.
El tema de archivos compatibles para que se abran desde el navegador, es posible que funcione en otro navegador. ¿Has probado en Firefox?
De todas maneras, la única solución que se me ocurre para que se descargue, es cambiándole el formato. Por ejemplo zip o doc posiblemente.
Buenas tades amigo Carlos, gracias por responder. la verdad si ya he probado con Firefox y con distintos navegadores y el resultado es el mismo. incluso coloque una imagen y el resultado es el mismo me sigue mostrando la imagen en el explorador. no se si sea algo en la configuracion del PHP 7 como tal, pero no consigo algo que haga referencia a ello, y coloque el ejemplo que sale en PHP.NET y me hace lo mismo… te adjunto las lineas de ese ejemplo:
$vNombre = «Lote2.txt»;
if (file_exists($vNombre)) {
header(‘Content-Description: File Transfer’);
header(‘Content-Type: application/octet-stream’);
header(‘Content-Disposition: attachment; filename=»‘.basename($vNombre).'»‘);
header(‘Expires: 0’);
header(‘Cache-Control: must-revalidate’);
header(‘Pragma: public’);
header(‘Content-Length: ‘ . filesize($vNombre));
readfile($vNombre);
exit;
}