Descargar archivo a través de una llamada ajax php

Resuelto theking963 asked hace 54 años • 6 respuestas

Tengo un botón y onclickllamará 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?

theking963 avatar Jan 01 '70 08:01 theking963
Aceptado

AJAX no es para descargar archivos. Abra una nueva ventana con el enlace de descarga como dirección, o haga document.location = ....

Marc B avatar Jul 12 '2011 17:07 Marc B

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-Typeencabezado correcto, para que el navegador sepa que es un archivo adjunto y comience la descarga.

blink281 avatar Nov 10 '2012 14:11 blink281