我正在尝试使用拖放上传大文件。 我有这段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
(根据http://www.w3.org/TR/XMLHttpRequest2/#the-send-method),我在文件拖放后检索到它。该代码适用于Chrome 12、Safari 5和Firefox 4,并将文件的原始内容发送到HTTP请求的主体中。
但是,如果文件足够大,则永远不会发送请求。相反,XMLHttpRequest
对象触发了错误事件(没有任何有用的消息)。在我的环境中,这个限制为86MB,但它因机器而异。
Chrome的JavaScript控制台显示以下消息:
POST http://localhost/xfiles/xfiles.php undefined (undefined)
这与我的代码无关(适用于小文件的代码完美运行)。
浏览器似乎会在发送文件之前将整个文件读入内存。可能出现内存不足异常或类似情况导致进程停止。无论如何,没有HTTP请求被发送,所以可以确定服务器限制与此问题无关。
总之,读取整个文件是一种浪费资源的行为。
是否有任何方法以流式方式按字节发送文件,而无需首先将其存储在内存中?