• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Загрузка больших файлов в помощью web интерфейса.

Slacky

Member
В общем изобрел очередной велосипед. Но он плохо едет. Точнее, он едет, но при ошибках ведет себя не так, как ожидается.

Исходники тут - https://github.com/slacky1965/web_server_uploader

У него всего три возможности.
1. Обновить прошивку через web.
2. Закачать какие-нибудь html файлы (например обновить старый или добавить новый).
3. Вывести на экран закачанные файлы в html директорию сервера.

Все работает. Но. При закачке прошивки, если файл больше области, выделенной под загрузку, вместо возвращения ошибки (в коде это все предусмотрено), происходит разрыв соединения и браузер пишет вот такую ошибку - Error! TypeError: NetworkError when attempting to fetch resource. А сервер должен был вернуть "Firmware image too large". И еще происходит странность. В логах отражается, что попытка закачки была два раза.

Код:
E (927438) web_server_http: Firmware image too large. (../main/http.c:290)
W (927438) httpd_txrx: httpd_resp_send_err: 400 Bad Request - Firmware image too large
W (927448) httpd_uri: httpd_uri: uri handler execution failed
E (927468) web_server_http: Firmware image too large. (../main/http.c:290)
W (927468) httpd_txrx: httpd_resp_send_err: 400 Bad Request - Firmware image too large
W (927478) httpd_uri: httpd_uri: uri handler execution failed
При попытке залить туда маленький файл, который не является файлом прошивки, обработка ошибки происходит корректно - "Invalid flash image type". А вот если взять файл не прошики, большой, но который меньше места под прошивку, т.е. теоретичеки он может быть загружен, то тоже выдает Error! TypeError: NetworkError when attempting to fetch resource.

Наверно сумбурно написал. Но, если файл правильный, то он загружается без проблем. А вот если он не файл прошивки и большой или просто слишком большой, то возникает проблема.

Может кто глянет, возможно JavaScript бузит, но поймать не получилось ...

error_false.jpgerror_false2.jpgerror_true.jpgerror_no.jpg
 

pvvx

Активный участник сообщества
При передаче файла указывается его размер и web сервер должен ответить ошибкой, если ему такой размер не нравится. JavaScript тут обычно не причем, т.к. браузер производит передач файла своими средствами...
 

Slacky

Member
Так сервер и отвечает. И логи об этом говорят. Я даже проверил, какой код возврата из функции, которая отправляет сообщение об ошибке. 0, т.е. ESP_OK. Но по какой-то причине браузер считает, что соединение сброшено, ответ пустой и длинный файл пытается загрузится минимум два раза.

Код:
E (927438) web_server_http: Firmware image too large. (../main/http.c:290)
C:
288        if (partition->size < req->content_len) {
289            err = "Firmware image too large";
290            ESP_LOGE(TAG, "%s. (%s:%u)", err, __FILE__, __LINE__);
291            esp_err_t ret = httpd_resp_send_err(req, HTTPD_400_BAD_REQUEST, err);
292            return ESP_FAIL;
        }
 

pvvx

Активный участник сообщества
Так сервер и отвечает. И логи об этом говорят. Я даже проверил, какой код возврата из функции, которая отправляет сообщение об ошибке. 0, т.е. ESP_OK. Но по какой-то причине браузер считает, что соединение сброшено, ответ пустой и длинный файл пытается загрузится минимум два раза.
Значит ESP городит несоблюдение протокола передачи файла. Счас смотреть и вспоминать лень, что и когда там воспринимается при передаче файла, но было такое когда писал прием и как-то решилось однозначно.
 
Сверху Снизу