Usare jQuery e iFrame per scaricare un file

Ho il seguente codice per scaricare un file .csv :

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

urlString punta a un servizio Restful che genera il file .csv e restituisce il percorso del file assegnato all’attributo src per l’iFrame. Funziona con qualsiasi file .csv ma ho problemi con .xml file .xml .

Quando uso lo stesso codice ma modificando contentType in text/xml e text/xml per scaricare file .xml , questo non funziona.

Posso usare lo stesso approccio qui per .xml file .xml ?

AGGIORNARE:

Grazie a Ben per avermi indirizzato nella giusta direzione. A quanto pare non ho bisogno della chiamata ajax. Invece, posso semplicemente usare l’iFrame e il suo attributo url per chiamare il servizio web, che genererà il contenuto, aggiungere l’intestazione ( Content-Disposition ) e restituire lo stream.

Immagino che il problema sia che la maggior parte dei browser proverà a eseguire il rendering XML nel browser stesso, mentre tendono a non avere alcun gestore per CSV, quindi verranno automaticamente impostati automaticamente per richiedere all’utente di scaricare il file. Prova a modificare le intestazioni del file XML per forzare il download. Qualcosa come (esempio 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"'); 

Questo dovrebbe dire alla maggior parte dei browser di non tentare di aprire il file, ma di avere l’utente a scaricare il file e lasciare che il sistema operativo determini cosa fare con esso.

Se non hai il potere di controllare le intestazioni nel file XML stesso, puoi provare a risolvere il problema con uno script sul lato server. Usa JS per passare l’URL a uno script sul lato server:

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

e sul lato server (il tuo http://example.com/load_file_script script) usi cURL / file_get_contents / wgets / [qualche altro meccanismo di recupero di file remoti] per afferrare il contenuto del file remoto, aggiungi il Content-Disposition: attachment intestazioni di Content-Disposition: attachment e print il codice del file originale.

Puoi anche offrirlo come download da un elemento di ancoraggio virtuale, anche se i dati sono lato 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/