• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе 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 городит несоблюдение протокола передачи файла. Счас смотреть и вспоминать лень, что и когда там воспринимается при передаче файла, но было такое когда писал прием и как-то решилось однозначно.
 
Сверху Снизу