Quel langage côté serveur utilisez-vous ? Dans mon application, je peux facilement télécharger un fichier à partir d'un appel AJAX en définissant les bons en-têtes dans la réponse de PHP :
Définition des en-têtes côté serveur
header("HTTP/1.1 200 OK");
header("Pragma: public");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
// The optional second 'replace' parameter indicates whether the header
// should replace a previous similar header, or add a second header of
// the same type. By default it will replace, but if you pass in FALSE
// as the second argument you can force multiple headers of the same type.
header("Cache-Control: private", false);
header("Content-type: " . $mimeType);
// $strFileName is, of course, the filename of the file being downloaded.
// This won't have to be the same name as the actual file.
header("Content-Disposition: attachment; filename=\"{$strFileName}\"");
header("Content-Transfer-Encoding: binary");
header("Content-Length: " . mb_strlen($strFile));
// $strFile is a binary representation of the file that is being downloaded.
echo $strFile;
Cela va en fait "rediriger" le navigateur vers cette page de téléchargement, mais comme @ahren l'a déjà dit dans son commentaire, il ne va pas s'éloigner de la page actuelle.
Il s'agit de définir les bons en-têtes. Je suis sûr que vous trouverez une solution adaptée au langage côté serveur que vous utilisez, si ce n'est pas PHP.
Traitement de la réponse côté client
En supposant que vous savez déjà comment faire un appel AJAX, vous exécutez une requête AJAX vers le serveur du côté client. Le serveur génère alors un lien à partir duquel ce fichier peut être téléchargé, par exemple l'URL "forward" vers laquelle vous voulez pointer. Par exemple, le serveur répond par :
{
status: 1, // ok
// unique one-time download token, not required of course
message: 'http://yourwebsite.com/getdownload/ska08912dsa'
}
Lors du traitement de la réponse, vous injectez un iframe
dans votre corps et de fixer le iframe
à l'URL que vous venez de recevoir comme ceci (en utilisant jQuery pour faciliter cet exemple) :
$("body").append("<iframe src='" + data.message +
"' style='display: none;' ></iframe>");
Si vous avez défini les bons en-têtes comme indiqué ci-dessus, l'iframe forcera l'ouverture d'une boîte de dialogue de téléchargement sans que le navigateur ne s'éloigne de la page actuelle.
Note
Pour répondre à votre question, je pense qu'il est préférable de toujours renvoyer le JSON lorsque vous demandez des choses avec la technologie AJAX. Après avoir reçu la réponse JSON, vous pouvez alors décider côté client de ce que vous voulez en faire. Par exemple, si plus tard vous souhaitez que l'utilisateur clique sur un lien de téléchargement vers l'URL au lieu de forcer le téléchargement directement, dans votre configuration actuelle, vous devrez mettre à jour les côtés client et serveur pour le faire.
0 votes
Pour ceux qui ont lu cet article, lisez ce post : stackoverflow.com/questions/20830309/
0 votes
J'ai supprimé votre solution de la question. Vous pouvez la publier dans un message de réponse ci-dessous, mais elle n'a pas sa place dans le message de la question.