GyverLibs/GyverPortal

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 😂 в общем попробую, варианты накостылить вполне имеется