Загрузка - 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, компиляции файлов в бинарник и т.д. Папка просто загружается через браузер и всё!