2015-06-29 8 views
6

Abbiamo un'API REST che emette JSON da cui è possibile ottenere i dati (utilizzando AJAX). Quello che vogliamo fare è essere in grado di fare chiamate AJAX dove ogni chiamata preleva una piccola porzione di dati (diciamo 5000 righe o giù di lì), e poi lo ha scritto in un file CSV sul browser come download.Come eseguire lo streaming di output AJAX per il download di un file in Javascript?

Sembra che se abbiamo tutti i dati nella memoria JS, quindi la scrittura in file CSV non è difficile, ma se vogliamo scrivere i record 100K, allora siamo costretti a recuperare tutti i 100K in un colpo e quindi produrre il file in un colpo solo.

Invece, riteniamo che sarebbe molto più delicato sia sul server che sul client scaricare piccoli blocchi e inviarlo in streaming al download del file. C'è un modo per farlo?

(Attualmente stiamo utilizzando jQuery 2.0.0, ma non mente utilizzando una libreria diversa per ottenere questo fatto)

+0

perché non usare un iframe nascosto per scaricare il flusso come file? http://stackoverflow.com/questions/16799483/using-jquery-and-iframe-to-download-a-file – Henrik

+0

@Henrik Funziona, DOPO che ho tutti i contenuti nella memoria JS. Voglio fare cicli di fetch-> writeout-to-file-> fetch. – Shreeni

+0

? non entra mai nella memoria JS. JS avvia semplicemente il download, puntando l'iframe alla fonte. Il browser si occupa del download e il server si occupa di suddividere il file in pacchetti di rete o ho completamente frainteso la domanda? http://stackoverflow.com/questions/3749231/download-file-using-javascript-jquery – Henrik

risposta

1

Fondamentalmente si sono alla ricerca di paging di record ... per questo si può fare

  1. trovare il numero totale di record nel database
  2. che dividere i record/nessuna delle chiamate
  3. Unire tutti i dati provenienti da diverse chiamate

per effettuare chiamate multiple utilizzando jQuery si può fare in questo modo

$.when($.ajax("/page1.php"), $.ajax("/page2.php")).done(function(a1, a2) { 
    // a1 and a2 are arguments resolved for the page1 and page2 ajax requests, respectively. 
    // Each argument is an array with the following structure: [ data, statusText, jqXHR ] 
    var data = a1[ 0 ] + a2[ 0 ]; // a1[ 0 ] = "Whip", a2[ 0 ] = " It" 
    if (/Whip It/.test(data)) { 
    alert("We got what we came for!"); 
    } 
}); 

nel codice ci sono molteplici chiamata AJAX e alla fine è l'unione dei dati ... la stessa cosa sul lato server si deve fare se si è usare C# rispetto a TPL (Task parellel library) è una buona opzione ... per ogni chiamata è necessario chiamare con il numero di pagina

+0

Ciò avrebbe ancora bisogno di me per memorizzare in modo efficace tutti i contenuti nella memoria JS, che è ciò che voglio evitare in primo luogo. – Shreeni

+0

Voglio fare cicli di fetch-> writeout-to-file-> fetch .. – Shreeni