Descargar archivo a través de una llamada ajax php
Tengo un botón y onclick
llamará a una función ajax.
Aquí está mi función ajax.
function csv(){
ajaxRequest = ajax();//ajax() is function that has all the XML HTTP Requests
postdata = "data=" + document.getElementById("id").value;
ajaxRequest.onreadystatechange = function(){
var ajaxDisplay = document.getElementById('ajaxDiv');
if(ajaxRequest.readyState == 4 && ajaxRequest.status==200){
ajaxDisplay.innerHTML = ajaxRequest.responseText;
}
}
ajaxRequest.open("POST","csv.php",false);
ajaxRequest.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
ajaxRequest.send(postdata);
}
Creo el archivo csv según la entrada del usuario. Una vez creado, quiero que solicite la descarga o fuerce la descarga (preferiblemente fuerce). Estoy usando el siguiente script al final del archivo php para descargar el archivo. Si ejecuto este script en un archivo separado, funciona bien.
$fileName = 'file.csv';
$downloadFileName = 'newfile.csv';
if (file_exists($fileName)) {
header('Content-Description: File Transfer');
header('Content-Type: text/csv');
header('Content-Disposition: attachment; filename='.$downloadFileName);
ob_clean();
flush();
readfile($fileName);
exit;
}
echo "done";
Pero si lo ejecuto al final de csv.php, genera el contenido del archivo.csv en la página (en ajaxDiv) en lugar de descargarlo.
¿Hay alguna manera de forzar la descarga del archivo al final de csv.php?
AJAX no es para descargar archivos. Abra una nueva ventana con el enlace de descarga como dirección, o haga document.location = ...
.
Una solución muy simple usando jQuery:
en el lado del cliente:
$('.act_download_statement').click(function(e){
e.preventDefault();
form = $('#my_form');
form.submit();
});
y en el lado del servidor, asegúrese de enviar el Content-Type
encabezado correcto, para que el navegador sepa que es un archivo adjunto y comience la descarga.