Загрузка - GyverLibs/GyverPortal GitHub Wiki

В библиотеке реализована удобная загрузка файлов из браузера в память esp. Процесс автоматизирован внутри библиотеки, но есть несколько сценариев работы на усмотрение юзера.

Ручная загрузка

  • Для работы с файловой системой нужно подключить соответствующую библиотеку и запустить её (рекомендуется LittleFS)
  • В конструкторе страницы нужно добавить элемент GP.FILE_UPLOAD("имя") - кнопка загрузки. Имя кнопки является внутренним именем и в дальнейшем поможет определить, с какой кнопки идёт загрузка. Также это имя можно использовать в качестве имени файла, который будет загружаться
  • В функции-обработчике действия функция upload() вернёт true, если начнётся загрузка файла
    • Внутри условия функция fileName() вернёт имя файла
    • Внутри условия функция uploadName() вернёт имя кнопки загрузки (указанное в конструкторе)
    • Далее нужно открыть файл любым удобным способом и передать в saveFile(). Библиотека сохранит загружаемый файл в указанный файл
  • В функции-обработчике действия функция uploadEnd() вернёт true, если загрузка файла завершена
    • Внутри условия можно обратиться к fileName() и uploadName() для определения, какой файл был загружен
  • В функции-обработчике действия функция uploadAbort() вернёт true, если загрузка файла была прервана

Механизм позволяет реализовать несколько сценариев загрузки файла, например использовать имя кнопки в качестве имени каталога и так далее

void action() {
  // начало загрузки
  if (portal.upload()) {
    Serial.print("Upload: ");
    Serial.print(portal.fileName());      // имя файла
    Serial.print(", from: ");
    Serial.println(portal.uploadName());  // имя формы загрузки

    // любым способом открыть и передать файл типа File
    // сохраним в корень по имени файла
    portal.saveFile(LittleFS.open('/' + portal.fileName(), "w"));  // в корень, по имени файла
    //portal.saveFile(LittleFS.open('/' + portal.uploadName(), "w"));   // в корень, по имени формы загрузки
    
    // использовать имя формы как каталог, имя файла - как имя файла
    //portal.saveFile(LittleFS.open('/' + portal.uploadName() + '/' + portal.fileName(), "w"));
  }

  // успешное окончание загрузки
  if (portal.uploadEnd()) {
    Serial.print("Uploaded file: ");
    Serial.print(portal.fileName());
    Serial.print(", from: ");
    Serial.println(portal.uploadName());
  }
}

См. пример fileUploadManual

Полуавтоматическая загрузка

Если не нужна сложная логика при выборе и открытии файла - можно указать библиотеке, какая файловая система используется, тогда файлы можно будет отправлять просто по имени файла - библиотека сама их откроет и закроет:

GyverPortal portal(&LittleFS);

void action() {
  if (portal.upload()) {
    Serial.print("Upload: ");
    Serial.print(portal.fileName());      // имя файла
    Serial.print(", from: ");
    Serial.println(portal.uploadName());  // имя формы загрузки

    // благодаря указанию LittleFS при инициализации портала мы можем загружать файлы просто по имени
    // указываем куда сохранять
    portal.saveFile('/' + portal.fileName());   // в корень, по имени файла
    //portal.saveFile('/' + portal.uploadName());   // в корень, по имени формы загрузки
    
    // использовать имя формы как каталог, имя файла - как имя файла
    //portal.saveFile('/' + portal.uploadName() + '/' + portal.fileName());
  }

  // успешное окончание загрузки
  if (portal.uploadEnd()) {
    Serial.print("Uploaded file: ");
    Serial.print(portal.fileName());
    Serial.print(", from: ");
    Serial.println(portal.uploadName());
  }
}

См. пример fileUpload

Автоматическая загрузка

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

  • Указать файловую систему GyverPortal portal(&LittleFS);
  • Включить автозагрузку portal.uploadAuto(true);
  • При желании можно ловить сигналы об успешно загруженных файлах
GyverPortal portal(&LittleFS);

void setup() {
  portal.uploadAuto(true);
}

void action() {
  // успешное окончание загрузки
  if (portal.uploadEnd()) {
    Serial.print("Uploaded file: ");
    Serial.print(portal.fileName());      // имя файла
    Serial.print(", from: ");
    Serial.println(portal.uploadName());  // имя формы загрузки
    // файл сохранится В КОРЕНЬ, С ИМЕНЕМ fileName()
  }
}

См. пример fileUploadAuto

Загрузка нескольких файлов

  • Кнопка GP.FILE_UPLOAD() поддерживает загрузку нескольких файлов сразу: каждый файл будет обработан отдельно (вызван upload с именем каждого)
  • Кнопка GP.FOLDER_UPLOAD() позволяет загрузить папку с подпапками и файлами в любых сочетаниях. Каждый файл будет обработан отдельно, имя файла fileName() будет содержать в себе полный путь от загружаемой папки. Фактически это более простая замена OTA загрузки файлов, т.к. не требует запуска Arduino IDE, компиляции файлов в бинарник и т.д. Папка просто загружается через браузер и всё!