我想用WebSocket API上傳大文件(至少500MB,最好高達幾GB)。問題是,我無法弄清楚如何編寫「發送這個文件的片段,釋放使用的資源然後重複」。我希望我可以避免使用像Flash/Silverlight這樣的東西。用WebSocket上傳大文件
目前,我沿着線的東西的工作:
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的?我的印象是WebSockets的開銷較小。 –
Websockets對雙向通信的開銷較小,但是,上傳文件只是將POST請求發送到包含正文中的文件的服務器。瀏覽器非常擅長,大文件的開銷幾乎沒有。 –
我正在考慮把它切成小塊。我想我會嘗試使用File API進行分片並使用XMLHttpRequest發送它,看看它是如何發生的。感謝您的幫助。如果你想用上面的信息作出回答,並且可能還有其他建議,我會樂意接受它作爲答案。 –