Я пытаюсь загрузить большие файлы (не менее 500 МБ, желательно до нескольких ГБ), используя API WebSocket. Проблема в том, что я не могу понять, как написать "отправить этот фрагмент файла, освободить используемые ресурсы, а затем повторить". Я надеялся, что смогу избежать использования чего-то типа 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, чтобы позволить мне правильно стоять в очереди, где я застрял.