Ich sehe, dass Sie bereits eine Lösung gefunden haben, aber ich wollte nur einige Informationen hinzufügen, die jemandem helfen können, mit großen POST-Anfragen dasselbe zu erreichen.
Ich hatte das gleiche Problem vor ein paar Wochen, tatsächlich ist es nicht möglich, einen "sauberen" Download über AJAX zu erreichen. Die Filament Group hat ein jQuery-Plugin erstellt, das genau so funktioniert, wie Sie es bereits herausgefunden haben. Es heißt jQuery File Download hat jedoch einen Nachteil dieser Technik.
Wenn Sie große Anfragen über AJAX senden (z. B. Dateien + 1 MB), wirkt sich dies negativ auf die Reaktionsfähigkeit aus. Bei langsamen Internetverbindungen müssen Sie viel warten, bis die Anforderung gesendet wird, und auch warten, bis die Datei heruntergeladen wurde. Es ist nicht wie ein sofortiger "Klick" => "Popup" => "Download-Start". Es ist eher wie "Klicken" => "Warten, bis Daten gesendet werden" => "Warten auf Antwort" => "Download-Start", wodurch die Datei doppelt so groß erscheint, da Sie auf das Senden der Anforderung warten müssen über AJAX und erhalten Sie es als herunterladbare Datei zurück.
Wenn Sie mit kleinen Dateigrößen <1 MB arbeiten, werden Sie dies nicht bemerken. Aber wie ich in meiner eigenen App festgestellt habe, ist es für größere Dateien fast unerträglich.
Mit meiner App können Benutzer dynamisch generierte Bilder exportieren. Diese Bilder werden über POST-Anforderungen im Base64-Format an den Server gesendet (dies ist der einzig mögliche Weg), dann verarbeitet und in Form von PNG-, JPG-Dateien und Base64 an Benutzer zurückgesendet Zeichenfolgen für Bilder + 1 MB sind sehr groß. Dadurch müssen Benutzer mehr als nötig warten, bis die Datei heruntergeladen wird. Bei langsamen Internetverbindungen kann es sehr ärgerlich sein.
Meine Lösung hierfür bestand darin, die Datei vorübergehend auf den Server zu schreiben, sobald sie fertig ist, dynamisch einen Link zur Datei in Form einer Schaltfläche zu generieren, die zwischen den Zuständen "Bitte warten ..." und "Herunterladen" wechselt Drucken Sie das base64-Bild in einem Vorschau-Popup-Fenster aus, damit Benutzer mit der rechten Maustaste darauf klicken und es speichern können. Dies macht die Wartezeit für Benutzer erträglicher und beschleunigt die Arbeit.
Update 30. September 2014:
Monate sind vergangen, seit ich dies gepostet habe. Endlich habe ich einen besseren Ansatz gefunden, um die Arbeit mit großen Base64-Strings zu beschleunigen. Ich speichere jetzt Base64-Zeichenfolgen in der Datenbank (unter Verwendung von Longtext- oder Longblog-Feldern), übergebe dann ihre Datensatz-ID über den Download der jQuery-Datei. Schließlich frage ich in der Download-Skriptdatei die Datenbank mit dieser ID ab, um die Base64-Zeichenfolge abzurufen und durchzuleiten die Download-Funktion.
Beispiel für ein Download-Skript:
<?php
// Record ID
$downloadID = (int)$_POST['id'];
// Query Data (this example uses CodeIgniter)
$data = $CI->MyQueries->GetDownload( $downloadID );
// base64 tags are replaced by [removed], so we strip them out
$base64 = base64_decode( preg_replace('#\[removed\]#', '', $data[0]->image) );
// This example is for base64 images
$imgsize = getimagesize( $base64 );
// Set content headers
header('Content-Disposition: attachment; filename="my-file.png"');
header('Content-type: '.$imgsize['mime']);
// Force download
echo $base64;
?>
Ich weiß, dass dies weit über das hinausgeht, was das OP verlangt hat, aber ich hielt es für gut, meine Antwort mit meinen Ergebnissen zu aktualisieren. Als ich nach Lösungen für mein Problem suchte, las ich viele "Download from AJAX POST data" -Threads, die mir nicht die gesuchte Antwort gaben. Ich hoffe, diese Informationen helfen jemandem, der so etwas erreichen möchte.