2013-03-08 23 views
5

Devo scaricare un file di dati di grandi dimensioni (> 100 MB) tramite XmlHttpRequest. I dati provengono da una terza parte e vorrei mostrare il contenuto gradualmente man mano che viene scaricato.Accesso ai dati già scaricati

Così ho pensato che il seguente dovrebbe funzionare:

var req = new XMLHttpRequest(); 
req.open("GET", mirror.url, true); 
req.responseType = "arraybuffer"; 

req.onload = function(oEvent) { 
    console.log("DONE"); 
}; 
var current_offset = 0; 
req.addEventListener("progress", function(event) { 
    if(event.lengthComputable) { 
     var percentComplete = Math.round(event.loaded * 100/event.total); 
    } 
    var data = req.response; 
    // Fails here: req.response is null till load is called 

    var dataView = new DataView(data); 
    while(current_offset < dataView.byteLength) { 
     // do work 
     ++current_offset; 
    } 

    console.log("OFFSET " + current_offset + " [" + percentComplete + "%]"); 

}, false); 
try { 
    req.send(null); 
} catch(er) { 
    console.log(er); 
} 

Purtroppo, secondo le specifiche, .response non è disponibile.

C'è un modo per accedere ai dati già scaricati senza andare a soluzioni orribili del genere come l'utilizzo di Flash?

EDIT:

trovato almeno una soluzione non standard di lavoro per Firefox:

responseType = "moz-chunked-arraybuffer"; 

Vedi anche: WebKit equivalent to Firefox's "moz-chunked-arraybuffer" xhr responseType

+1

Aspetta, vuoi inviare 100MB al mio browser ?! Quale potrebbe essere sul mio telefono? – DOK

+1

@DOK Confido che tu sia abbastanza intelligente da non chiamare un sito web intensivo per la larghezza di banda e il calcolo sul nostro telefono. – abergmeier

+0

Hai provato a utilizzare req.responseText? – JamieJag

risposta

2

Una soluzione sarebbe scaricare solo parti del file utilizzando richieste di intervallo per scaricare solo parti del file. Per ulteriori informazioni vedere il seguente post sul blog HTTP Status: 206 Partial Content and Range Requests.

Se si ha il controllo del server, è possibile dividere il file sul lato server e scaricarne dei blocchi. In questo modo sarai in grado di accedere alla risposta man mano che vengono ricevuti i diversi blocchi.

Un terzo approccio consiste nell'utilizzare WebSockets per scaricare i dati.

Se non si ha il controllo del server da cui si sta scaricando e nessuna delle altre opzioni funzionerà, sarà probabilmente necessario implementare un servizio proxy che fungerà da intermediario e consentirà di scaricare solo una parte di esso.

+0

Purtroppo i dati provengono da una terza parte, quindi devo usare il file nel modo in cui lo forniscono. – abergmeier

+0

Aggiunte altre due possibili soluzioni che potrebbero funzionare quando non si ha il controllo del server. – TAS

+0

Finché _Chrome_ non implementa _Streams API_, questa sembra essere l'unica soluzione. Dovrà esaminare una soluzione parziale, dal momento che non voglio avere costi per l'hosting. – abergmeier

0

Hai guardato utilizzando una libreria per questo?

Non l'ho mai usato per caricare un file da 100 MB, ma lo PreloadJS è molto utile per caricare tutti i tipi di risorse.

+0

C'è qualche menzione, che è possibile accedere allo stato parzialmente scaricato? Non riesco a trovarlo. – abergmeier

+0

Hmm. Pensavo di ricordarmi che avresti potuto, ma forse hai ragione. Potrebbe non essere possibile fino al termine del caricamento dei dati. È possibile accedere a XHR.response ed è un oggetto ArrayBuffer, ma potrebbe essere popolato solo dopo il caricamento. –

Problemi correlati