Ответ клиенту при неудачной загрузке файла на сервер
Пишется небольшой HTTP-бэкэнд на Qt C++. На веб-странице есть загрузка файла через AJAX (работа с FormData() через JS):
let file = this.files[0];
let formData = new FormData();
formData.append('file', file);
let xhr = new XMLHttpRequest();
xhr.open("POST", '/url', true);
xhr.send(formData);
xhr.onload = function() {
...
}
xhr.onerror = function() {
...
}
Локальные тесты проходят отлично: файлы целиком загружаются на сервер. Однако, при тестах в реальных условиях с пингом пользователя >500ms, успешно загружаются только мелкие файлы (до 100КБ), остальные приходят не целиком. То есть, сокет пользователя закрывается, но из него извлекается лишь фрагмент файла (как правило, начальный кусок). Пытался отлавливать повторные обращения клиента с попыткой доотправки файла, но таких запросов вообще нет. Клиент суёт как получилось и больше не пытается ничего делать, а на сервере остается практически мусор.
Вопрос: как работают веб-сервра с медленными подключениями, позволяя загружать большие файлы, когда связь с веб-браузером пользователя постонно обрывается и он если отсылает снова из-за ошибки соединения - отсылает снова файл сначала одной попыткой? Гуглёжка каких-то специализированных ответов HTTP-сервера о неполном файле результатов не дала, да и вообще каких-то информативных ответов на загрузку файла нет, только заголовочные 403, 200 и т.п..
Ответы (1 шт):
Очевидная ошибка была в цикле чтения, где по умолчанию 30 секунд, а я поставил 0.5. За полсекунды просто не было данных для чтения и цикл прекращался с неполным файлом.
while (m_socket->waitForReadyRead()) {
}