2013-03-08 20 views
5

Potrzebuję pobrać duży plik danych (> 100 MB) za pośrednictwem XmlHttpRequest. Dane pochodzą od strony trzeciej i chciałbym wyświetlać zawartość stopniowo, gdy zostanie pobrana.Uzyskiwanie dostępu do już pobranych danych

Pomyślałem więc dodaje będzie działać:

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

Niestety, według specyfikacji, .response nie jest dostępna.

Czy istnieje sposób uzyskania dostępu do już pobranych danych bez przechodzenia do tak okrutnych obejść, jak używanie Flash?

EDIT:

Znaleziony przynajmniej działa niestandardowe rozwiązanie dla Firefox:

responseType = "moz-chunked-arraybuffer"; 

Patrz także: WebKit equivalent to Firefox's "moz-chunked-arraybuffer" xhr responseType

+1

Czekaj, chcesz wysłać 100MB do mojej przeglądarki ?! Które może być na moim telefonie? – DOK

+1

@DOK Ufam, że jesteś wystarczająco inteligentny, aby nie wywoływać w naszym telefonie strony internetowej o zwiększonej przepustowości i intensywności obliczeń. – abergmeier

+0

Czy próbowałeś użyć ponownie req.responseText? – JamieJag

Odpowiedz

2

Jednym z rozwiązań byłoby pobranie tylko części pliku za pomocą żądań zakresu, aby pobrać tylko części pliku. Aby uzyskać więcej informacji, zobacz następujący wpis na blogu: HTTP Status: 206 Partial Content and Range Requests.

Jeśli masz kontrolę nad serwerem, możesz również podzielić plik po stronie serwera i pobrać jego fragmenty. W ten sposób uzyskasz dostęp do odpowiedzi, gdy otrzymasz różne porcje.

Trzecim podejściem byłoby użycie WebSockets do pobrania danych.

Jeśli nie masz kontroli nad serwerem, z którego pobierasz i żadna z innych opcji nie zadziała, prawdopodobnie będziesz musiał zaimplementować usługę pośredniczącą, która będzie działała jako półprodukt i umożliwi pobranie tylko jej części.

+0

Niestety dane pochodzą od osób trzecich, więc muszę użyć pliku w taki sposób, w jaki jest on dostarczany. – abergmeier

+0

Dodano jeszcze dwa możliwe rozwiązania, które mogą działać, gdy nie masz kontroli nad serwerem. – TAS

+0

Tak długo, jak _Chrome_ nie implementuje _Streams API_, to naprawdę wydaje się być jedynym rozwiązaniem. Będę musiał spojrzeć na częściowe obejście treści, ponieważ nie chcę mieć kosztów hostingu. – abergmeier

0

Pan spojrzał w użyciu biblioteki dla tego?

Nigdy nie użyłem go do załadowania pliku 100 MB, ale PreloadJS jest całkiem niezły do ​​ładowania wszystkich rodzajów zasobów.

+0

Czy jest jakaś wzmianka, że ​​można uzyskać dostęp do stanu częściowo pobranego? Nie mogę tego znaleźć. – abergmeier

+0

Hmm. Myślałem, że pamiętałem, że możesz, ale może masz rację. Może to być niemożliwe, dopóki dane nie zostaną załadowane. Możesz dostać się do XHR.response i jest to obiekt ArrayBuffer, ale może on zostać wypełniony dopiero po załadowaniu. –

Powiązane problemy