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$.ajax({
url: "tu-script-php-que-devuelve-la-ruta.php",
data: {
ruta: "tu-ruta",
fichero: "tu-fichero.pdf"
},
type:"POST",
success: function( r ) {
var rutaDevuelta = r;
var a = document.createElement( "A" );
a.setAttribute( "download", "" );
a.setAttribute( "href", rutaDevuelta );
a.click();
}
});
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.