Foros del Web » Programando para Internet » PHP »

Descargar PDF desde el servidor

Estas en el tema de Descargar PDF desde el servidor en el foro de PHP en Foros del Web. Buenos días. Estoy haciendo pruebas para descargar PDFs desde el servidor y me pasa algo que no se resolver. Quiero ocultar el directorio de donde ...
  #1 (permalink)  
Antiguo 09/06/2017, 05:27
 
Fecha de Ingreso: septiembre-2003
Mensajes: 140
Antigüedad: 20 años, 7 meses
Puntos: 2
Descargar PDF desde el servidor

Buenos días.

Estoy haciendo pruebas para descargar PDFs desde el servidor y me pasa algo que no se resolver.

Quiero ocultar el directorio de donde se descarga la gente el PDF, por lo que a través de AJAX hago una llamada a un archivo PHP y le paso unos parametros.

En ese PHP tengo lo siguiente:

Código PHP:
<?php
    
require 'funciones.php';
    
    
$ruta $_POST['ruta'];
    
$fichero $_POST['fichero'];
    
    
$resultado descargaPDF($ruta,$fichero);
        
    
header('Content-type: application/pdf');
        
header('Content-Disposition: attachment; filename="documento.pdf"');
    
readfile($resultado);
?>
La ruta que viene de AJAX solo es el año y el mes y la trabajo en la funcion descargaPDF() de funciones.php;

$resultado he comprobado que devuelve la ruta completa del PDF, así que funciona bien, pero no sale nada.

El caso es que inspeccionando el codigo con chrome, en el response de php veo todo el codigo del PDF, y si lo copio y lo abro en el navegador, efectivemente, es el PDF. Pero de cara al usuario no me sale la opcion de descargar ni se abre en una ventana ni sale una preview ni nada.

¿Alguna idea?
  #2 (permalink)  
Antiguo 09/06/2017, 11:49
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 8 meses
Puntos: 2237
Respuesta: Descargar PDF desde el servidor

No se pueden descargar archivos por AJAX, todo lo que necesitas es un enlace (o formulario) al script para descarga.
__________________
- León, Guanajuato
- GV-Foto
  #3 (permalink)  
Antiguo 10/06/2017, 03:18
Avatar de manuparquegiralda  
Fecha de Ingreso: junio-2012
Ubicación: Barcelona
Mensajes: 241
Antigüedad: 11 años, 10 meses
Puntos: 39
Respuesta: Descargar PDF desde el servidor

No es necesario que uses AJAX para eso, creo que podrías hacer. Se me ocurren dos maneras de hacerlo. Una es forzando la descarga desde PHP, aunque no puede ser directamente desde el AJAX si no que tendrías que abrir la ruta del script y otra se puede hacer por javascript y utilizando el atributo download de HTML, aunque este no está 100% soportado todavía https://caniuse.com/#search=download%20attribute

Utilizando el atributo download

Código Javascript:
Ver original
  1. $.ajax({
  2.     url: "tu-script-php-que-devuelve-la-ruta.php",
  3.     data: {
  4.         ruta: "tu-ruta",
  5.         fichero: "tu-fichero.pdf"
  6.     },
  7.     type:"POST",
  8.     success: function( r ) {
  9.         var rutaDevuelta = r;
  10.         var a = document.createElement( "A" );
  11.         a.setAttribute( "download", "" );
  12.         a.setAttribute( "href", rutaDevuelta );
  13.         a.click();
  14.     }
  15. });

Código PHP:
<?php 
    
require 'funciones.php'
     
    
$ruta $_POST['ruta']; 
    
$fichero $_POST['fichero']; 
     
    
$resultado descargaPDF($ruta,$fichero); 
    echo 
$resultado;
?>
Muy simplificado por supuesto lo que haces en vez de leer el fichero es en el PHP es devolver la ruta.

En el javascript creas un elemento "a", le asignas el atributo download y el href con la ruta del fichero a descargar y después simulas un click. Esto descargará el PDF sin mostrar la ruta, eso sí, no podrás hacerlo desde IE11 (como no) ni desde opera Mini o IOS safari.


Forzando descarga en PHP

El otro modo en lugar de usar ajax, lo que puedes hacer es abrir una nueva pestaña apuntando al script que lo que hará es forzar la descarga en PHP a través del fpassthru en liugar de leer el fichero.

Código PHP:

<?php 
    
require 'funciones.php'
     
    
$ruta $_GET['ruta']; 
    
$fichero $_GET['fichero']; 
     
    
$resultado descargaPDF($ruta,$fichero);  // debe dar la ruta para leerla en el servidor no en el navegador.

    
header"Content-type: application/octet-stream" );
    
header"Content-Disposition: attachment; filename=\"$resultado \"\n" );
    
$fo=fopen$resultado"r");
    
fpassthru$fo );
?>
Creo que era algo así, lo he escrito de memoria así que no sé si habrá alguna falta. Ten presente que esto no se puede hacer por ajax o a menos creo que no, así que bastará con que abras una pestaña nueva en el navegador con javascript aputando al script y en lugar de enviar los datos por POST lo envías por GET en la url.
__________________
Diseño Web - Arisman Web

Etiquetas: pdf, servidor
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 08:01.