2013-03-08 18 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