Utilisation de jQuery et iFrame pour télécharger un fichier

J'ai le code suivant pour télécharger un fichier .csv:

$.ajax({ url: urlString, contentType: "application/json; charset=utf-8", dataType: "json", cache: false, success: function (data) { if (data) { var iframe = $("<iframe/>").attr({ src: data, style: "visibility:hidden;display:none" }).appendTo(buttonToDownloadFile); } else { alert('Something went wrong'); } } }); 

UrlString pointe vers un service RESTful qui génère le fichier .csv et renvoie le chemin du fichier attribué à l'attribut src pour iFrame. Cela fonctionne pour tous les fichiers .csv mais j'ai des problèmes avec les fichiers .xml. Lorsque j'utilise le même code mais que je change le type de contenu en "texte / xml" et que je l'utilise pour télécharger des fichiers .xml, cela ne fonctionne pas.

Puis-je utiliser la même approche ici pour les fichiers .xml?

METTRE À JOUR:

Merci à Ben de me montrer la bonne direction. Il s'avère que je n'ai pas besoin de l'appel ajax du tout. Au lieu de cela, je peux simplement utiliser l'iFrame et son attribut url pour appeler le service Web, qui générera le contenu, ajouter l'en-tête ( Content-Disposition ) et renvoyer le flux.

Je suppose que le problème est que la plupart des navigateurs essaieront de rendre XML dans le navigateur lui-même, alors qu'ils ont tendance à ne pas avoir de gestionnaire pour CSV, donc ils automatiquement par défaut pour inciter l'utilisateur à télécharger le fichier. Essayez de modifier les en-têtes du fichier XML pour forcer le téléchargement. Quelque chose comme (exemple PHP):

 header("Content-Type: application/force-download"); header("Content-Type: application/octet-stream"); header("Content-Type: application/download"); header('Content-Disposition: attachment; filename="some filename"'); 

Cela devrait indiquer à la plupart des navigateurs de ne pas tenter d'ouvrir le fichier, mais plutôt de demander à l'utilisateur de télécharger le fichier et de laisser le système d'exploitation déterminer ce qu'il faut faire avec lui.

Si vous n'avez pas le pouvoir de contrôler les en-têtes dans le fichier XML lui-même, vous pouvez essayer un travail en utilisant un script côté serveur. Utilisez JS pour passer l'URL vers un script côté serveur

 //build the new URL var my_url = 'http://mysite.com/load_file_script?url='+escape(path_to_file); //load it into a hidden iframe var iframe = $("<iframe/>").attr({ src: my_url, style: "visibility:hidden;display:none" }).appendTo(buttonToDownloadFile); 

Et sur le côté du serveur (votre script http://mysite.com/load_file_script ), vous utilisez cURL / file_get_contents / wgets / [un autre mécanisme d'extraction de fichiers distants] pour saisir le contenu du fichier distant, ajouter le Content-Disposition: attachment têtes et print le code du fichier d'origine.

Vous pouvez également l'offrir en téléchargement à partir d'un élément d'ancrage virtuel, même si les données sont côté client:

 /* * Create an anchor to some inline data... */ var url = 'data:application/octet-stream,Testing%20one%20two%20three'; var anchor = document.createElement('a'); anchor.setAttribute('href', url); anchor.setAttribute('download', 'myNote.txt'); /* * Click the anchor */ // Chrome can do anchor.click(), but let's do something that Firefox can handle too // Create event var ev = document.createEvent("MouseEvents"); ev.initMouseEvent("click", true, false, self, 0, 0, 0, 0, 0, false, false, false, false, 0, null); // Fire event anchor.dispatchEvent(ev); 

http://jsfiddle.net/D572L/