2013-03-08 4 views
5

Мне нужно загрузить большой (> 100 МБ) файл данных через XmlHttpRequest. Данные получены от третьей стороны, и я хотел бы постепенно отображать контент по мере его загрузки.Доступ к уже загруженным данным

Так я думал, что следующий будет работать:

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

К сожалению, в соответствии со спецификацией, .response не доступен.

Есть ли способ получить доступ к уже загруженным данным, не прибегая к таким ужасным обходным решениям, как использование Flash?

EDIT:

Найдено по крайней мере, рабочий нестандартное решение для Firefox:

responseType = "moz-chunked-arraybuffer"; 

Смотрите также: WebKit equivalent to Firefox's "moz-chunked-arraybuffer" xhr responseType

+1

Ждут, вы хотите отправить 100MB в мой браузер ?! Что может быть на моем телефоне? – DOK

+1

@ DOK Надеюсь, вы достаточно умны, чтобы не называть интенсивный сайт с пропускной способностью и интенсивным вычислением на нашем телефоне. – abergmeier

+0

Вы пытались использовать req.responseText вместо этого? – JamieJag

ответ

2

Одним из решений было бы загрузить только части файла, используя запросы диапазона, чтобы загружать только части файла. Для получения дополнительной информации см. Следующее сообщение в блоге HTTP Status: 206 Partial Content and Range Requests.

Если у вас есть контроль над сервером, вы также можете разделить файл на стороне сервера и загрузить его куски. Таким образом, вы сможете получить доступ к ответу, когда будут получены различные куски.

Третий подход заключается в использовании WebSockets для загрузки данных.

Если у вас нет контроля над сервером, который вы загружаете, и ни одна из других функций не будет работать, вам, вероятно, потребуется реализовать прокси-службу, которая будет действовать как промежуточная и позволит вам загружать только ее часть.

+0

К сожалению, данные взяты из сторонних источников, поэтому я должен использовать файл так, как они его предоставляют. – abergmeier

+0

Добавлены еще два возможных решения, которые могут работать, если у вас нет контроля над сервером. – TAS

+0

Пока _Chrome_ не реализует _Streams API_, это действительно кажется единственным решением. Вам придется посмотреть на обходное решение частичного контента, так как я не хочу иметь затраты на хостинг. – abergmeier

0

Вы смотрели с использованием библиотеки для этого?

Я никогда не использовал его для загрузки файла размером 100 МБ, но PreloadJS довольно хорош для загрузки всех видов активов.

+0

Есть ли упоминание о том, что вы можете получить доступ к частично загруженному состоянию? Не могу найти. – abergmeier

+0

Хм. Я думал, что помню, что ты мог, но, возможно, ты прав. Это может быть невозможно, пока данные не закончат загрузку. Вы можете перейти к сообщению XHR.response, и это объект ArrayBuffer, но он может быть заполнен только после загрузки. –

Смежные вопросы