Что бы не упираться в ограничения:
- разбивать файл на чанки равной длины
- загружать чанки параллельно на несколько разных суб.доменов (st1.example.com, st2.example.com ... stN.example.com)
- использовать http2 соединение
- передавать файлы (и чанки в том числе) в бинарном виде
Если количество входных точек меньше чем количество чанков то на некоторые адреса будет несколько отправлений, желательно не переустанавливать соединение, а держать хотя бы keep-alive, а ещё лучше разобраться как передать данные после текущей отправки в текущее соединение.
Замерять скорость:
- сети между серверами и клиентом
- пропускную способность веб-сервера
- общую нагрузку на сервер
- io диска куда складываются данные
Возможно есть проблема:
- со скоростью работы диска, может быть он сбоит и потерял 80% своей скорости
- с загрузкой канала между сервером и клиентом
- слишком много запросов к веб-серверу и он просто блокируется постоянно
- браузер перегружен плагинами или слишком много js кода который убивает отзывчивость
Так же попробуйте отправить файл на другой сервер похожим образом и сравнить.
Более подробно про отправку файла чанками:
sendFile: function(file) {
if (file.size > this.maxFileSize) {
this.alert('Файл слишком большой!');
return false;
}
var fd = new FormData();
fd.append("file", file);
// Создаем запрос
var xhr = new XMLHttpRequest();
xhr.upload.addEventListener('progress', context({obj: this}, this.uploadProgress), false);
xhr.onreadystatechange = context({obj: this, html: html}, obj.uploadFinish);
xhr.open('POST', this.handler);
xhr.send(fd);
},
Тут мы видим
xhr.send(fd), теперь идём в один из примеров, например
https://learn.javascript.ru/xhr-resume и видим вариант с отправкой части файла:
var slice = file.slice(10, 100); // прочитать байты с 10-го по 99-й включительно
xhr.send(slice); // ... и отправить эти байты в запросе.
Если у вас получится сделать механизм многопоточной загрузки то
можете контрибьютить в этот репозитарий:
https://github.com/mantyr/js-drag-n-drop-file-uplo... так как он
чуть более объектный чем классический
dropzone