Je vois que vous avez déjà trouvé une solution, mais je voulais juste ajouter quelques informations qui pourraient aider quelqu'un à essayer de faire la même chose avec de grandes demandes POST.
J'ai eu le même problème il y a quelques semaines, en effet, il n'est pas possible de réaliser un téléchargement "propre" via AJAX, le Filament Group a créé un plugin jQuery qui fonctionne exactement comme vous l'avez déjà découvert, il s'appelle jQuery File Téléchargez cependant il y a un inconvénient à cette technique.
Si vous envoyez de grosses demandes via AJAX (par exemple, des fichiers + 1 Mo), cela aura un impact négatif sur la réactivité. Dans les connexions Internet lentes, vous devrez attendre beaucoup jusqu'à ce que la demande soit envoyée et également attendre le téléchargement du fichier. Ce n'est pas comme un "clic" instantané => "popup" => "début de téléchargement". Cela ressemble plus à "cliquer" => "attendre que les données soient envoyées" => "attendre la réponse" => "démarrer le téléchargement" ce qui fait apparaître le fichier deux fois sa taille car vous devrez attendre que la demande soit envoyée via AJAX et récupérez-le sous forme de fichier téléchargeable.
Si vous travaillez avec des fichiers de petite taille <1 Mo, vous ne le remarquerez pas. Mais comme je l'ai découvert dans ma propre application, pour des fichiers plus volumineux, c'est presque insupportable.
Mon application permet aux utilisateurs d'exporter des images générées dynamiquement, ces images sont envoyées via des requêtes POST au format base64 au serveur (c'est le seul moyen possible), puis traitées et renvoyées aux utilisateurs sous forme de fichiers .png, .jpg, base64 les chaînes d'images + 1 Mo sont énormes, ce qui oblige les utilisateurs à attendre plus que nécessaire pour que le fichier commence à télécharger. Dans les connexions Internet lentes, cela peut être très ennuyeux.
Ma solution a été d'écrire temporairement le fichier sur le serveur, une fois qu'il est prêt, de générer dynamiquement un lien vers le fichier sous la forme d'un bouton qui change entre les états "Veuillez patienter ..." et "Télécharger" et en même temps temps, imprimez l'image base64 dans une fenêtre contextuelle d'aperçu afin que les utilisateurs puissent "cliquer avec le bouton droit" et l'enregistrer. Cela rend tout le temps d'attente plus supportable pour les utilisateurs et accélère également les choses.
Mise à jour du 30 septembre 2014:
Des mois se sont écoulés depuis que j'ai posté cela, j'ai finalement trouvé une meilleure approche pour accélérer les choses lorsque je travaille avec de grandes chaînes de base64. Je stocke maintenant des chaînes base64 dans la base de données (en utilisant des champs de texte long ou de blog long), puis je passe son ID d'enregistrement via le téléchargement de fichier jQuery, enfin sur le fichier de script de téléchargement Je recherche la base de données en utilisant cet ID pour extraire la chaîne base64 et la passer la fonction de téléchargement.
Télécharger l'exemple de script:
<?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;
?>
Je sais que c'est bien au-delà de ce que le PO a demandé, mais j'ai pensé qu'il serait bon de mettre à jour ma réponse avec mes conclusions. Lorsque je cherchais des solutions à mon problème, j'ai lu beaucoup de threads "Télécharger à partir des données AJAX POST" qui ne m'ont pas donné la réponse que je cherchais, j'espère que ces informations aideront quelqu'un qui cherche à réaliser quelque chose comme ça.