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);