Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] No funciona la descarga de un pdf mediante header()

Estas en el tema de No funciona la descarga de un pdf mediante header() en el foro de PHP en Foros del Web. Hola amig@s, Estoy revisando y repasando todo lo que he podido encontrar y no consigo entender porque no funciona este código: @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código PHP: ...
  #1 (permalink)  
Antiguo 10/10/2012, 09:20
 
Fecha de Ingreso: noviembre-2003
Ubicación: Zaragoza, España
Mensajes: 1.257
Antigüedad: 20 años, 5 meses
Puntos: 154
No funciona la descarga de un pdf mediante header()

Hola amig@s,

Estoy revisando y repasando todo lo que he podido encontrar y no consigo entender porque no funciona este código:

Código PHP:
Ver original
  1. <?php
  2.  
  3. $fichero = "carpeta_del_archivo/".$archivo; // aqui la ruta al archivo pdf
  4. if (file_exists($fichero)) {
  5.     header ("Expires: Thu, 27 Mar 1980 23:59:00 GMT"); //la pagina expira en una fecha pasada
  6.     header ("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); //ultima actualizacion ahora cuando la cargamos
  7.     header ("Cache-Control: no-cache, must-revalidate"); //no guardar en CACHE
  8.     header ("Pragma: no-cache");
  9.     header ("Content-Description: File Transfer");
  10.     header ("Content-type: application/force-download");
  11.     header ("Content-type: application/pdf");
  12.     header ("Content-Disposition: attachment ; filename=".$archivo);
  13.     header ("Content-Transfer-Encoding: binary");
  14.     header ("Expires: 0");
  15.     header ("Content-Length: " . filesize($archivo));
  16.     ob_clean();
  17.     flush();
  18.     readfile($fichero);
  19.     exit;
  20. }else{
  21.  
  22. ?>
  23. <p>Archivo inexistente</p>
  24. <?php
  25.  
  26. }
  27.  
  28. ?>

Lo que hace es que me muestra en pantalla toooodos los símbolos raros que se le ocurren al navegador, creo que es el código del pdf que pretendo descargar, pero no me lo descarga ni me lo muestra en pantalla, lo que necesito es descargarlo sí o sí.

Lo he probado en IE, FF y Chrome por si era problema del navegador, pero no funciona en ninguno...

¿Alguien puede echarme una mano?

Gracias por adelantado.

.
  #2 (permalink)  
Antiguo 10/10/2012, 11:37
Avatar de Perr0  
Fecha de Ingreso: mayo-2005
Ubicación: Santiago de Chile, Chile
Mensajes: 676
Antigüedad: 18 años, 10 meses
Puntos: 79
Respuesta: No funciona la descarga de un pdf mediante header()

reemplaza del else hacia abajo esto y prueba:

Código PHP:
Ver original
  1. }else{
  2.     echo "<p>Archivo inexistente</p>";
  3. }
  4.  
  5. ?>
__________________
Numerador Mp3 en Access =)
http://www.mediafire.com/download/r9...pdw/mp3(2).zip
  #3 (permalink)  
Antiguo 10/10/2012, 11:49
 
Fecha de Ingreso: noviembre-2003
Ubicación: Zaragoza, España
Mensajes: 1.257
Antigüedad: 20 años, 5 meses
Puntos: 154
Respuesta: No funciona la descarga de un pdf mediante header()

Hola Perr0,

Gracias por responder, he probado lo que dices y ocurre lo mismo, realmente es que no tengo ni idea de qué hacer.

Espero que alguien pueda ayudarme.

.
  #4 (permalink)  
Antiguo 10/10/2012, 12:36
Avatar de cuasatar  
Fecha de Ingreso: junio-2011
Ubicación: Bogotá Rock City
Mensajes: 1.230
Antigüedad: 12 años, 10 meses
Puntos: 181
Respuesta: No funciona la descarga de un pdf mediante header()

Hace poco logre hacer un sistema como el que necesitas y la verdad no necesite tantos parametros de encabezado para lograr el cometido.

Código PHP:
header ("Content-type: application/force-download");
header ("Content-type: application/pdf"); 
Yo quitaria el force download porque si ya sabes que es un pdf no existe la necesidad de forzar la descarga y quizas queda loco y no sabe a cual encabezado le debe hacer caso.

Si el tipo de contenido no corresponde con el archivo que descargas por eso te salen esos simbolos tan raros.

Igual yo use este tutorial y me sirvio aunque en mi caso en especial yo tenia el tipo mime de los archivos en una base de datos y no use las funciones que se usan en este ejemplo para obtener el mime.

http://www.ngeeks.com/2010/04/01/for...hivos-con-php/
__________________
Blog de humor http://elcuasatar.net63.net/
  #5 (permalink)  
Antiguo 10/10/2012, 13:13
 
Fecha de Ingreso: noviembre-2003
Ubicación: Zaragoza, España
Mensajes: 1.257
Antigüedad: 20 años, 5 meses
Puntos: 154
Respuesta: No funciona la descarga de un pdf mediante header()

Hola cuasatar,

Gracias por responder. Te cuento:

Cita:
Iniciado por cuasatar Ver Mensaje
Hace poco logre hacer un sistema como el que necesitas y la verdad no necesite tantos parametros de encabezado para lograr el cometido.

Código PHP:
header ("Content-type: application/force-download");
header ("Content-type: application/pdf"); 
Yo quitaria el force download porque si ya sabes que es un pdf no existe la necesidad de forzar la descarga y quizas queda loco y no sabe a cual encabezado le debe hacer caso.
He probado a quitarlo y hace lo mismo, de todas formas, el ponerlo es para que fuerce la descarga en vez de abrirlo en el navegador, pero da igual porque no funciona con eso ni sin eso...

Cita:
Iniciado por cuasatar Ver Mensaje
Si el tipo de contenido no corresponde con el archivo que descargas por eso te salen esos simbolos tan raros.
El archivo es un pdf, eso seguro porque lo he creado yo mismo también, por eso no entiendo por qué no lo quiere descargar este !"$"·$%· sistema...

Cita:
Iniciado por cuasatar Ver Mensaje
Igual yo use este tutorial y me sirvio aunque en mi caso en especial yo tenia el tipo mime de los archivos en una base de datos y no use las funciones que se usan en este ejemplo para obtener el mime.

http://www.ngeeks.com/2010/04/01/for...hivos-con-php/
Muchas gracias por el tutorial, pero tampoco lo consigo...

De todas formas, algo ha tenido que cambiar porque el otro día me encontré con algo parecido pero referente a un excel, lo tenía programado para descargarlo de la forma tradicional, creando la tabla en HTML y descargándolo con los headers, funcionaba perfectamente y de repente dejó de funcionar, igual que esto...

En fin, a ver si aquí que somos tantos, alguien sabe por donde tirar para resolverlo...

Muchas gracias de nuevo.

.
  #6 (permalink)  
Antiguo 10/10/2012, 16:51
Avatar de cuasatar  
Fecha de Ingreso: junio-2011
Ubicación: Bogotá Rock City
Mensajes: 1.230
Antigüedad: 12 años, 10 meses
Puntos: 181
Respuesta: No funciona la descarga de un pdf mediante header()

Bueno, yo puedo dar fe que si funciona el enlace que te mande salvo la parte de la manera como se obtenia el tipo mime de archivo y yo se la modifique. Yo haria lo siguiente y perdon si suena muy a basica primaria:

1. verifica que el archivo si existe (ya se que si existe) pero con la funcion is_file de php, si te bota false pues es imposible que logre la descarga porque no encuentra el archivo para descargar.

2. usa un script pequeño para subir el archivo (no es necesario ponerlo en una carpeta) e imprime con un echo el el valor del tipo del archivo (el type) para verificar que si es un pdf y ese es el que usaras para descargar.

3. Usa el script que te mande pero para obtener el tipo usa el que te bota directamente la impresion que hiciste al subir el archivo.

4. No nos digas ya lo cambie y no me funciona porque eso y nada nos da igual. Recuerda que esto es foros del web y no el castillo de Hogwarts. No somos magos para saber que cambios le hiciste.
__________________
Blog de humor http://elcuasatar.net63.net/
  #7 (permalink)  
Antiguo 11/10/2012, 06:51
 
Fecha de Ingreso: noviembre-2003
Ubicación: Zaragoza, España
Mensajes: 1.257
Antigüedad: 20 años, 5 meses
Puntos: 154
Respuesta: No funciona la descarga de un pdf mediante header()

Hola cuasatar,

Gracias por responder de nuevo y por la paciencia

Cita:
Iniciado por cuasatar Ver Mensaje
Bueno, yo puedo dar fe que si funciona el enlace que te mande salvo la parte de la manera como se obtenia el tipo mime de archivo y yo se la modifique. Yo haria lo siguiente y perdon si suena muy a basica primaria:
Nunca nada es demasiado básico, siempre se puede aprender y, en todo caso, viendo las cosas sencillas se puede detectar un error de esos tontos que no se ven hasta que te lo dicen...

Cita:
Iniciado por cuasatar Ver Mensaje
1. verifica que el archivo si existe (ya se que si existe) pero con la funcion is_file de php, si te bota false pues es imposible que logre la descarga porque no encuentra el archivo para descargar.
Si te fijas en el código que posteé, esto ya lo hago, por eso sabía que el error no está ahí.

Cita:
Iniciado por cuasatar Ver Mensaje
2. usa un script pequeño para subir el archivo (no es necesario ponerlo en una carpeta) e imprime con un echo el el valor del tipo del archivo (el type) para verificar que si es un pdf y ese es el que usaras para descargar.
El valor que me imprime es "application/pdf" y ese es el que coloco en la cabecera.

Cita:
Iniciado por cuasatar Ver Mensaje
3. Usa el script que te mande pero para obtener el tipo usa el que te bota directamente la impresion que hiciste al subir el archivo.
Así lo he hecho, soy muy obediente

Cita:
Iniciado por cuasatar Ver Mensaje
4. No nos digas ya lo cambie y no me funciona porque eso y nada nos da igual. Recuerda que esto es foros del web y no el castillo de Hogwarts. No somos magos para saber que cambios le hiciste.
Tienes razón, pero es que los cambios que hago son los que me proponéis, por eso lo explico así.

¡¡Estoy tonto!! ¿Pues no le estaba cargando HTML antes de los headers? ¿Ves cuasatar como de cualquier cosa se puede aprender y ver errores tontos?

Muchísimas gracias por todos los aportes y disculpad la tontería que me he mandado...

.
  #8 (permalink)  
Antiguo 11/10/2012, 07:12
Avatar de cuasatar  
Fecha de Ingreso: junio-2011
Ubicación: Bogotá Rock City
Mensajes: 1.230
Antigüedad: 12 años, 10 meses
Puntos: 181
Respuesta: No funciona la descarga de un pdf mediante header()

Vamos, no pasa nada con los errores (tontos y no tan tontos) Yo la semana pasada estaba en las mismas y aunque me fue "facil" lograr mi cometido (que solo me demore 2 horas ) siempre es bueno hacer una depuración del aplicativo para ir detectando errores y aprender de ellos. Si fueras tan amable y compartes con los demás la solución a tu problema creo que todos te lo agradeceriamos, así seria mas facil evitar que personas que a futuro tengan el mismo problema que el tuyo caigan en el mismo error.
__________________
Blog de humor http://elcuasatar.net63.net/
  #9 (permalink)  
Antiguo 11/10/2012, 09:48
 
Fecha de Ingreso: noviembre-2003
Ubicación: Zaragoza, España
Mensajes: 1.257
Antigüedad: 20 años, 5 meses
Puntos: 154
Respuesta: No funciona la descarga de un pdf mediante header()

Por supuesto que comparto la solución, en definitiva es lo mismo que tenía pero quitando los includes que contenían HTML y alguna otra línea de HTML también, queda así:

Código PHP:
Ver original
  1. require_once ("configuraciones.php"); // incluir configuracion.
  2.  
  3. $archivo = "archivo.pdf"; // nombre del archivo pdf a descargar
  4.  
  5. if ($_GET['desc'] == "variable_de_control_del_archivo") {
  6.  
  7.  
  8. $fichero = /home/user/public_html/descarga/".$archivo; // aqui la ruta al archivo pdf
  9. if (file_exists($fichero)) {
  10.     header ("Expires: Thu, 27 Mar 1980 23:59:00 GMT"); //la pagina expira en una fecha pasada
  11.     header ("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); //ultima actualizacion ahora cuando la cargamos
  12.     header ("Cache-Control: no-cache, must-revalidate"); //no guardar en CACHE
  13.     header ("Pragma: no-cache");
  14.     header ("Content-type: application/pdf");
  15.     header ("Content-Disposition: attachment ; filename=".basename($archivo));
  16.     ob_clean();
  17.     flush();
  18.     readfile($fichero);
  19.     exit;
  20. }else{ // Si no existe el archivo, mostramos error
  21. ?>
  22. <p style='font-family: georgia; text-align: center; color: #CC0000; font-weight: bold; font-size: 22pt; padding-top: 120pt;'>Archivo inexistente</p>
  23. <?php
  24.  
  25. }
  26.  
  27. } else { // Si no tiene la variable de control, mostramos otro error
  28. ?>
  29. <p style='font-family: georgia; text-align: center; color: #CC0000; font-weight: bold; font-size: 22pt; padding-top: 120pt;'>No estás autorizado a descargar este e-book.</p>
  30. <?php
  31. }
  32.  
  33. ?>

Así de sencillo, pero me compliqué la vida aprovechando otro script que tenía y no me di cuenta de quitarle los includes de los menúes y encabezados, así como los encabezados HTML que había por ahí.

Todo por no revisar bien, pero ahora ya está, espero que le sirva a alguien, está probado en FF, IE, Chrome, Opera y Safari y a mi me funciona en todos.

Etiquetas: mediante, pdf
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 05:33.