GP.FILE_MANAGER не удаляет файлы
F4ntik opened this issue · 13 comments
В примере fileUploadAuto при нажатии на крестик файлы не удаляются. Остальные элементы объекта работают как нужно.
Плата esp32, ядро 2.0.6
В общем и целом, пока ждал ответа примерно докопался где клюк
Добавил пару строк Serial.print в библиотеку файла portal.h
} else if (_uri.startsWith(F("/GP_delete"))) { // удаление
if (_autoDel && _fs) {
#if defined(FS_H)
//Дебаг Начало
Serial.print("Remove -> server.argName(0)= ");
Serial.println(server.argName(0));
//Дебаг Конец
_fs->remove(server.argName(0));
#endif
} else _delF = 1;
_showPage = 1;
} else if (_uri.startsWith(F("/GP_rename"))) { // переименовать
if (_autoRen && _fs) {
#if defined(FS_H)
//Дебаг Начало
Serial.print("Rename -> server.argName(0)= ");
Serial.println(server.argName(0));
Serial.print("arg= ");
Serial.println(server.arg(0));
_fs->remove(server.argName(0));
//_fs->rename(server.argName(0), server.arg(0));
//Дебаг Конец
#endif
В "/GP_delete" server.argName(0) прилетает пустым, а в "/GP_rename" как нужно именем файла.
Решил просто в "/GP_rename" заменить _fs->rename на _fs->remove и стало удалять... При этом конечно же появляется диалоговое окно с вводом нового имени файла.
В общем нашел причину. Если java передает вконце ссылки на файл символ "=", то удаление срабатывает. Видимо где-то ошибка при обработке строки. Ищет "=" и делит на аргументы , для rename на два, для delete видимо не может т.к. не находит "=".
Изменял так, чтобы html генерился уже с "=" в builder.h (1095 строка)
*_GPP += F("\")'>❌</span>\n");
на
*_GPP += F("=\")'>❌</span>\n");
Потом попробовал в jscript в коце добавить "="
function GP_delete(url){if(!confirm('Delete '+url+'?'))return;GP_send('/GP_delete?'+url+'=',1);}
В общем либо на стороне сервера поправлять парсинг входящей строки с разделителем =, либо в на фронте добавлять "=" в конце строки при отправке на сервер.
Дальше я устал думать =(
Т.к. я не кодер... у меня лапки, мне было сложно... устал целую ночь потратил :(
Чтобы не плодить топиков, нашел еще багофичу, если переименовать файл и удалить у него расширение.
Например файл topic.doc переименовать в /restart, то будет открываться страница /restart или любая другая с именем файла, вместо отображения самого файла в новой странице браузера. Я понимаю что это стандартное поведение href в html. А при нажатии на кнопку скачать файл (она же кнопка\иконка download) то скачивается "имя_файла_бес_расширения+.html". При этом скачивается не сам файл, а копия текущей html страницы.
Отсюда следует, что надо добавить в примеры (работе с файлами) обработчик удаления расширения файла, при переименовывании. Возможно описать данное поведение в вики, или в комментарии к примеру.
И исправить скачивание файла без расширения.
P.S. Еще неплохо было бы сделать примеры с однотипным заданием имен переменных и классов. Например в половине GyverPortal ui(&LittleFS); а где-то GyverPortal portal(&LittleFS);
В примере fileUploadAuto при нажатии на крестик файлы не удаляются
На актуальной версии всё работает как часы в разных браузерах
вместо отображения самого файла в новой странице браузера
Портал обрабатывает ссылку как файл только при наличии расширения после точки, это есть в документации
в половине GyverPortal ui(&LittleFS); а где-то GyverPortal portal(&LittleFS);
в актуальной версии нет примеров с portal
Я проверял на версии
GyverPortal 3.5.2
Библиотека устанавливалась через менеджер библиотек на Arduino IDE 2.0.3
Еще с git качнул, проверил, та же проблема.
Вот еще как доказательство глюка https://community.alexgyver.ru/threads/gyverportal.6632/post-138430
Там в коде portal.ino где используется File_manager есть комментарий что надо поправить удаление. (Мой проект делал на основе этого)
Возможно в какой-то сторонней зависимости дело?
В данный момент работает только с исправленной функции в gp_data\scripts.js
Дополнение:
Для проверки только что установил PlatformIO, перенес проект а ArduinoIDE. Добавил две библиотеки в проект через менеджер библиотек от PlatformIO : GyverPortal и EEmanager. Почему-то в папке с библиотекой установленной таким образом, в отличии от архива с github и arduino ide, отсутствует папка data\gp_data. Теперь даже если вручную её перенести из GitHub архива, и попытаться изменить scripts.js, он не изменяется в http://192.168.0.6/GP_SCRIPT.js?v3.5.2=0
Ситуация такая-же - не работает кнопочка удаления файла.
Ссылка на проект для PlatformIO чтобы проверить: https://disk.yandex.ru/d/KIZ8EYyguX0BYQ
За основу взят код с проекта на форуме (ссылку приводил выше).
P.S. Извини что отнимаю время
Возможно дело в браузере/операционной системе. На чем открывается страница?
Возможно дело в браузере/операционной системе. На чем открывается страница?
На мобильном (андроид), и на компе в яндекс браузере, edge.
Если добавлять в скрипте = в конце строки функции удаления файла, то работает хоть откуда.
У меня на PlatformIO GP.FILE_MANAGER из стандартных примеров тоже не работает.
Думаю веб сервер парсит прилетевшую строку на аргументы своеобразно.
в актуальной версии нет примеров с portal
На вики примеры с portal
Отпишусь на твоём форуме в теме GyverPortal и поспрашиваю там. Если будет результат напишу сюда.
Так, а это не есп32 случаем?
Вижу, есп32. Да, у неё есть такой баг, нужно добавить знак равно.... У меня везде так сделано, тут видимо пропустил. Спасибо!
Рад помочь =) Надеюсь на развитие проекта.
Можно кстати добавить в File_Manager нижней строкой свободное место в памяти для файлов.
На 8266 есть такая строка ;) на 32 не получилось по человечески сделать, тк spiffs/littlefs сильно отличается реализация и "нативно" универсально я пока не придумал как можно закостылить
Может буду как капитан очевидность, не знаю просто реализацию через spiffs
попробовать #ifdef esp32
и на основе примера ниже
Serial.print("FS used bytes: ");
Serial.println(LittleFS.usedBytes());
Serial.print("FS total bytes: ");
Serial.println(LittleFS.totalBytes());
Serial.print("FS Free bytes: ");
int freeBytes = LittleFS.totalBytes()-LittleFS.usedBytes();
Serial.println(freeBytes);
а в самой LittleFS.cpp эти функции реализованы так
size_t LittleFSFS::totalBytes()
{
size_t total,used;
if(esp_littlefs_info(partitionLabel_, &total, &used)){
return 0;
}
return total;
}
size_t LittleFSFS::usedBytes()
{
size_t total,used;
if(esp_littlefs_info(partitionLabel_, &total, &used)){
return 0;
}
return used;
}
У меня сделано так, что файловая система передаётся в функцию по указателю, как наследник класса FS. В реализации FS есп32 нет функции измерения свободного места, а использовать через указатель личные функции littlefs/spiffs уже нельзя. Подключать обе библиотеки и делать ещё один флаг будет некрасиво и возможно даже не скомпилится. В этом и затык.
Понял.
Только писать в git espressif. Примерно посмотрел, там ни в коммитах не в issues нет такой темы.
Спасибо за диалог.
Ну, потому что разные файловые системы, по разному считается свободная память. Но на 8266 сделано по другому)
Ещё можно передавать в функцию напрямую значения занято/всего в зависимости от своей fs. Либо дефайн сделать, который будет подставлять функции от разных fs 😂 в общем попробую, варианты накостылить вполне имеется