Ver Mensaje Individual
  #3 (permalink)  
Antiguo 10/06/2017, 03:18
Avatar de manuparquegiralda
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