Javascript 使用XmlHttpRequest:Streaming发送文件?

Javascript 使用XmlHttpRequest:Streaming发送文件?,javascript,upload,streaming,xmlhttprequest,Javascript,Upload,Streaming,Xmlhttprequest,我正在尝试通过拖放上传大文件。我有一段Javascript代码: xhr = new XMLHttpRequest(); xhr.open('POST', url, true); xhr.setRequestHeader('X-File-Name', file.name); xhr.setRequestHeader('X-File-Size', file.size); xhr.setRequestHeader('Content-Type', file.type); xhr.send(file);

我正在尝试通过拖放上传大文件。我有一段Javascript代码:

xhr = new XMLHttpRequest();
xhr.open('POST', url, true);
xhr.setRequestHeader('X-File-Name', file.name);
xhr.setRequestHeader('X-File-Size', file.size);
xhr.setRequestHeader('Content-Type', file.type);
xhr.send(file);
其中,
url
是目标url的字符串,
file
是我在文件拖放后检索到的
Blob
(根据)。这段代码在Chrome 12、Safari 5和Firefox 4中工作,并在HTTP请求体中发送文件的原始内容

但是,如果文件足够大,则永远不会发送请求。相反,
XMLHttpRequest
对象触发并发生错误事件(没有任何有用的消息)。在我的环境中,此限制为86Mb,但不同机器的限制不同

Chrome的javascript控制台显示以下消息:

POST http://localhost/xfiles/xfiles.php undefined (undefined)
这与我的代码无关(它可以完美地处理较小的文件)

浏览器似乎在发送文件之前读取了内存中的整个文件。可能是内存不足异常或类似情况导致进程停止。在任何情况下,都不会发送HTTP请求,因此可以确定服务器的限制与此问题无关

无论如何,读取整个文件是对资源的浪费

是否有任何方法可以以流式方式逐字节发送文件,而不必先将其存储在内存中?

尝试使用该方法将
Blob
拆分为多个块,并将每个块作为单独的请求发送。

今天,使用chrome 31(windows),xhr.send(文件)不会将整个文件读入内存。事实上,我试着发送100mb的xhr文件,并查看任务管理器的chrome内存使用情况——在100mb的文件上传过程中,它只会略微增长

作为旁注,
xhr.send(file)
更适合PUT上传,因为POST更适合FormData:

  var formData = new FormData();
  formData.append("thefile", file);
  xhr.send(formData);

但是,使用FormData会将上载时间增加50%左右,这可能是因为base64编码。

我刚刚用Blob.slice实现了解决方案,即使是4GB的文件也能完美地工作!非常感谢。你能给我举个例子,如何切片和发送blob多块吗。谢谢:)如何将wach one作为单独的请求发送?是否可能只使用相同的XMLHttpRequest对象?或者应该为每个数据块创建一个新的对象?我认为必须为每个数据块创建一个新的XMLHttpRequest对象。基本上,您可以分割文件,在单独的http请求中发送每个片段,然后在服务器上将它们重新组合在一起。@Na7coldwater您如何识别服务器上的通信?一个大的随机字符串?