Ich sehe, dass du bereits eine Lösung gefunden hast, aber ich wollte nur noch einige Informationen hinzufügen, die jemandem helfen könnten, der versucht, dasselbe mit großen POST-Anfragen zu erreichen.
Ich hatte vor ein paar Wochen dasselbe Problem, es ist tatsächlich nicht möglich, einen "sauberen" Download über AJAX zu erreichen. Die Filament Group hat ein jQuery-Plugin erstellt, das genau so funktioniert, wie du es bereits herausgefunden hast, es heißt jQuery File Download, aber es gibt einen Nachteil bei dieser Technik.
Wenn du große Anfragen über AJAX sendest (zum Beispiel Dateien über 1 MB), wird sich die Reaktionsfähigkeit negativ auswirken. Bei langsamen Internetverbindungen musst du lange warten, bis die Anfrage gesendet wird, und auch darauf warten, dass die Datei heruntergeladen wird. Es ist nicht so wie ein sofortiger "Klick" => "Popup" => "Download starten". Es ist eher wie "Klick" => "Warten, bis Daten gesendet werden" => "Auf Antwort warten" => "Download starten", was dazu führt, dass die Datei doppelt so groß aussieht, weil du auf die Übermittlung der Anfrage über AJAX warten und sie als herunterladbare Datei erhalten musst.
Bei kleinen Dateigrößen unter 1 MB wirst du das nicht bemerken. Aber wie ich in meiner eigenen App festgestellt habe, ist es bei größeren Dateigrößen fast unerträglich.
Meine App ermöglicht es Benutzern, dynamisch generierte Bilder zu exportieren. Diese Bilder werden im base64-Format über POST-Anfragen an den Server gesendet (es ist der einzige mögliche Weg), dort verarbeitet und anschließend in Form von .png-, .jpg-Dateien, base64-Strings für Bilder über 1 MB sind riesig. Dies zwingt Benutzer dazu, länger als nötig auf den Beginn des Dateidownloads zu warten. Bei langsamen Internetverbindungen kann das wirklich nervig sein.
Meine Lösung dafür war, die Datei vorübergehend auf dem Server zu speichern. Sobald sie fertig ist, generiere ich dynamisch einen Link zur Datei in Form eines Buttons, der zwischen den Zuständen "Bitte warten..." und "Download" wechselt, und drucke gleichzeitig das base64-Bild in einem Vorschaufenster aus, sodass Benutzer es mit "Rechtsklick" speichern können. Dadurch wird die Wartezeit für Benutzer erträglicher und beschleunigt gleichzeitig die Dinge.
Update 30. Sep 2014:
Seitdem ich das gepostet habe, sind Monate vergangen, endlich habe ich einen besseren Ansatz gefunden, um die Dinge zu beschleunigen, wenn man mit großen base64-Strings arbeitet. Ich speichere die base64-Strings jetzt in der Datenbank (unter Verwendung von longtext- oder longblob-Feldern), dann gebe ich die Datensatz-ID über das jQuery File Download weiter, und schließlich frage ich im Download-Skript-Datei die Datenbank unter Verwendung dieser ID ab, um den base64-String abzurufen und ihn durch die Download-Funktion zu übergeben.
Beispiel für das Download-Skript:
MyQueries->GetDownload( $downloadID );
// base64-Tags werden durch [removed] ersetzt, also entfernen wir sie
$base64 = base64_decode( preg_replace('#\[removed\]#', '', $data[0]->image) );
// Dieses Beispiel gilt für base64-Bilder
$imgsize = getimagesize( $base64 );
// Inhaltsheader festlegen
header('Content-Disposition: attachment; filename="my-file.png"');
header('Content-type: '.$imgsize['mime']);
// Download erzwingen
echo $base64;
?>
Ich weiß, dass das weit über das hinausgeht, was der OP gefragt hat, aber ich dachte, es wäre gut, meine Antwort mit meinen Erkenntnissen zu aktualisieren. Als ich nach Lösungen für mein Problem gesucht habe, habe ich viele Threads zu "Download von AJAX POST-Daten" gelesen, die mir nicht die Antwort gegeben haben, die ich gesucht habe. Ich hoffe, diese Informationen helfen jemandem, der versucht, so etwas zu erreichen.