2017-06-09 2 views
0

Ich muss große Datei im Excel-Format exportieren und herunterladen. Ich benutze PHP-Excel. Datei ist sehr groß, so dass es viel Zeit in Export dauert. also benutze ich async ajax call und auf serverseite verwende ich session_write_close. Dadurch kann ich gleichzeitige Anrufe senden. Das funktioniert gut, wenn ich auf der gleichen Seite bleiben ... aber wenn ich Ajax Anruf an senden exportieren und herunterladen Datei und danach umleiten ich auf eine neue Seite vor der Fertigstellung dieser Ajax Anruf dann, dass Ajax Anruf abgebrochen wurde und Datei kann nicht heruntergeladen werden. Wie kann ich eine Datei exportieren und sie dann herunterladen, auch nachdem der Benutzer auf eine neue URL umgeleitet wurde?wie exportiert und dann eine Excel-Datei mit Ajax-Aufruf im Hintergrund in PHP herunterladen

+0

Ohne Ihren Code anzusehen? Öffnen eines Ajax-Anrufs in einem neuen Fenster oder Warten auf Beendigung des Anrufs, bevor auf eine neue Seite umgeleitet wird. –

+0

Content-Disposition: in Ihrer Datei –

+0

Der folgende Code ist für das Generieren des Aufrufs verantwortlich. 'GetReportData: function() {$ .ajax ({ Typ: 'POST', async: true, url: url, datatype: "json", Daten: Daten}) .done (function (Daten) { var $ a = $ $ a.attr ("href", data.file); $ ("body"). Append ($ a); $ a.attr (" download ", data.name); $ a [0] .click(); $ a.remove(); }); } ' –

Antwort

1

Es gibt mehrere Möglichkeiten, die Download-Aktion auf derselben Seite durchzuführen. Die Verwendung von Async kann zu Problemen führen, da Ihre Anwendung möglicherweise zwischen den AJAX-Operationen zurückbleibt.

Meiner Meinung nach können Sie Ihre Ajax Anfrage auf diese Weise tun.

Nach der Erstellung der Datei verwenden Sie den Befehlszeilen-Ansatz, wenn es möglich ist. Oder Sie können einfach den Systembefehl mit dem Befehl curl oder elinks verwenden und die URL übergeben, die zum Generieren der Excel-Datei verwendet wird.

curl http://mysite/generate/excel?id=123 

oder

elinks http://mysite/generate/excel?id=123 

Durch die Verwendung von Ajax (sync) Sie können eine Anfrage mit lebendig Option halten und in Ihrem Code überprüfen, ob die Datei mit einem Intervall erzeugt wird. Ihr Code wie dies

while (!file_exists("path/to/excel_file.xlsx")) { 

    usleep(2000); 
} 

echo json_encode(["status" => true, "file_url" => "http://mysite/url/to/excel_file.xlsx"]); 

seine Sobald Sie Antwort von Ajax erhalten, auf Erfolg Funktionsaufruf unter Funktion mit Datei-URL-Datei über iframe auf der gleichen Seite zum Download bereit.

downloadAttachment(response.file_url) 

/* Amazing download management with error handling */ 

var downloadAttachment = function(link){ 

    var iframe = document.createElement("iframe"), iframeWindow; 

    iframe.src = link; 

    document.body.appendChild(iframe); 

    iframe.onload = function(){ 

     response = JSON.parse($(iframe).contents().text()) 

     if(!response.status) 
     { 
      alert(response.message); 
      $(iframe).remove(); 
     } 
    } 

    setTimeout(function(){ 

     $(iframe).remove(); 

    },10000) 
} 

Dies ist logisch Fluss, wie große Dateien herunterladen, wenn es lange dauert zu erzeugen.

+0

Sehr geehrte Pratik, Vielen Dank für Ihre Antwort, aber es dauert nicht wirklich Zeit beim Herunterladen dauert es Zeit ** Generieren Excel-Datei und während dieser Zeit, wenn der Client auf andere Seite umleiten dann Aufrufe abgebrochen und Datei doesn ' t heruntergeladen werden, auch wenn die Dateierzeugung abgeschlossen ist. –

+0

@Muhammad, Ja das wollte ich genau erklären. Möglicherweise müssen Sie die Weiterleitung alarmieren. 'window.onbeforeunload' oder Sie müssen via Socket oder auf andere Weise, wie immer wenn eine Seite geladen wird, überprüfen, ob die Datei für diesen Benutzer existiert und eine Aktion zum Herunterladen der Datei durchführen. –

Verwandte Themen