2013-03-08 37 views
5

我需要通過XmlHttpRequest下載大量(> 100MB)的數據文件。數據來自第三方,我希望在下載內容時逐漸顯示內容。訪問已下載的數據

所以我想下面將工作:

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這樣的可怕解決方法?

編輯:

發現至少有一個工作非標準Firefox的解決方案:

responseType = "moz-chunked-arraybuffer"; 

參見:WebKit equivalent to Firefox's "moz-chunked-arraybuffer" xhr responseType

+1

等等,你想發送100MB到我的瀏覽器?哪些可能在我的手機上? – DOK 2013-03-08 15:17:51

+1

@DOK我相信您足夠聰明,不會在我們的手機上撥打帶寬和計算密集型網站。 – abergmeier 2013-03-08 15:28:22

+0

您是否嘗試過使用req.responseText呢? – JamieJag 2013-03-08 15:30:48

回答

2

一個解決方案是僅使用範圍請求下載部分文件,以僅下載文件的一部分。欲瞭解更多信息,請參閱以下博文HTTP Status: 206 Partial Content and Range Requests

如果您可以控制服務器,也可以在服務器端拆分文件並下載它的塊。這樣,您可以在接收到不同的塊時訪問響應。

第三種方法是使用WebSockets來下載數據。

如果您無法控制要下載的服務器,而其他選項都不起作用,您可能需要實施代理服務,該服務將充當中間服務器,並允許您下載其中的一部分。

+0

不幸的是,數據來自第三方,所以我必須按照他們提供的方式使用該文件。 – abergmeier 2013-03-08 17:18:07

+0

增加了另外兩種可能的解決方案,當您不控制服務器時可能會起作用。 – TAS 2013-03-08 17:38:01

+0

只要_Chrome_沒有實現_Streams API_,這似乎是唯一的解決方案。必須查看部分內容解決方法,因爲我不希望託管成本。 – abergmeier 2013-03-08 18:14:50

0

你有沒有看使用庫呢?

我從來沒有用它來加載100MB文件,但PreloadJS是非常適合加載各種資產。

+0

有沒有提及,你可以訪問部分下載的狀態?找不到。 – abergmeier 2013-03-08 15:49:22

+0

嗯。我以爲我記得你可以,但也許你是對的。直到數據加載完成纔有可能。你可以到達XHR.response,它是一個ArrayBuffer對象,但它只能在加載後填充。 – 2013-03-08 16:48:17