我正在尝试使用 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 可以让我正确排队,这就是我卡住的地方。