Perché threre non è un modo per scaricare file usando una richiesta Ajax?

Nella nostra applicazione dobbiamo implementare il seguente scenario:

  1. Una richiesta viene inviata dal cliente
  2. Il server gestisce la richiesta e genera il file
  3. Il server restituisce il file in risposta
  4. Il browser client visualizza la finestra di dialogo di download del file e consente all’utente di scaricare il file

La nostra applicazione è un’applicazione basata su jquery.ajax() , quindi sarebbe molto facile e conveniente per noi inviare una richiesta jquery.ajax() come usare la funzione jquery.ajax() ).

Ma dopo il googilng, si è scoperto che il download di file è ansible solo quando si utilizza una richiesta POST non Ajax (come descritto in questo popolare thread SO ). Quindi abbiamo dovuto implementare una soluzione più brutta e complessa che richiedesse la costruzione di una struttura HTML di form con campi nascosti nidificati.

Qualcuno potrebbe spiegare in parole semplici perché le richieste di ajax non possono essere utilizzate per scaricare file? Qual è la meccanica dietro a questo?

Non si tratta di AJAX. È ansible scaricare un file con AJAX, ovviamente. Tuttavia il file verrà mantenuto in memoria, ovvero non è ansible salvare il file su disco. Questo perché JavaScript non può interagire con il disco. Questo sarebbe un serio problema di sicurezza ed è bloccato in tutti i principali browser.

Questo può essere fatto usando la nuova funzionalità HTML5 chiamata Blob. C’è una libreria FileSaver.js che può essere utilizzata come wrapper su quella funzione.

È la stessa domanda che mi ero posto due giorni fa. C’era un progetto con il client scritto usando ExtJS e la realizzazione lato server era su ASP.Net. Devo tradurre il lato server in Java. C’era una funzione per scaricare un file XML, quel server genera dopo richiesta Ajax dal client. Sappiamo tutti che è imansible scaricare il file dopo la richiesta Ajax, solo per memorizzarlo. Ma … nel browser dell’applicazione originale mostra la solita finestra di dialogo con le opzioni aperte, salva e annulla il download. ASP.Net ha in qualche modo cambiato il comportamento standard … Mi ci vuole due giorni per provare di nuovo – non c’è modo di scaricare il file su richiesta al solito modo … l’unica eccezione è ASP.Net … Ecco ASP.Net codice

 public static void WriteFileToResponse(byte[] fileData, string fileName) { var response = HttpContext.Current.Response; var returnFilename = Path.GetFileName(fileName); var headerValue = String.Format("attachment; filename={0}", HttpUtility.UrlPathEncode( String.IsNullOrEmpty(returnFilename) ? "attachment" : returnFilename)); response.AddHeader("content-disposition", headerValue); response.ContentType = "application/octet-stream"; response.AddHeader("Pragma", "public"); var utf8 = Encoding.UTF8; response.Charset = utf8.HeaderName; response.ContentEncoding = utf8; response.Flush(); response.BinaryWrite(fileData); response.Flush(); response.Close(); } 

Questo metodo è stato chiamato da WebMethod, che a sua volta è stato chiamato da ExtJS.Ajax.request. Questa è la magia. Per quanto mi riguarda, ho finito con servlet e iframe nascosti …

puoi farlo utilizzando iframe nascosti nella tua pagina di download

basta impostare la src del ifame nascosto nella tua risposta ajax di successo e il tuo compito è fatto …

  $.ajax({ type: 'GET', url: './page.php', data: $("#myform").serialize(), success: function (data) { $("#middle").attr('src','url'); }, });