【发布时间】:2012-06-20 06:16:19
【问题描述】:
我正在尝试使用 WebSocket API 上传大文件(至少 500MB,最好达到几 GB)。问题是我不知道如何编写“发送这部分文件,释放使用的资源然后重复”。我希望我可以避免为此使用 Flash/Silverlight 之类的东西。
目前,我正在处理以下内容:
function FileSlicer(file) {
// randomly picked 1MB slices,
// I don't think this size is important for this experiment
this.sliceSize = 1024*1024;
this.slices = Math.ceil(file.size / this.sliceSize);
this.currentSlice = 0;
this.getNextSlice = function() {
var start = this.currentSlice * this.sliceSize;
var end = Math.min((this.currentSlice+1) * this.sliceSize, file.size);
++this.currentSlice;
return file.slice(start, end);
}
}
然后,我会使用以下方式上传:
function Uploader(url, file) {
var fs = new FileSlicer(file);
var socket = new WebSocket(url);
socket.onopen = function() {
for(var i = 0; i < fs.slices; ++i) {
socket.send(fs.getNextSlice()); // see below
}
}
}
基本上这会立即返回,bufferedAmount 不变(0),它会在尝试发送之前不断迭代并将所有切片添加到队列中;没有 socket.afterSend 允许我正确排队,这就是我卡住的地方。
【问题讨论】:
-
假设我不想依赖 Flash/Silverlight,我应该使用什么? XMLHttpRequest?我的印象是 WebSocket 的开销更少。
-
Websockets 的双向通信开销较小,是的,但是上传文件只是向服务器发送 POST 请求,文件在正文中。浏览器在这方面非常擅长,大文件的开销几乎为零。
-
我正在考虑将其切成小块。我想我会尝试使用 File API 对其进行切片并使用 XMLHttpRequest 发送它,看看情况如何。谢谢您的帮助。如果您想根据上述信息以及任何其他建议做出回答,我很乐意接受它作为答案。
-
只需将 xhr 调用替换为 websocket 发送即可获得大文件上传stackoverflow.com/questions/5053290/…
-
是的,但我决定使用简单的 Ajax 调用而不是 WebSockets。实现是微不足道的,您只需要将下一个 send() 排队到上一个'完成。
标签: javascript html websocket large-files fileapi