Dateinamen mit URL-Encoding

Hi Zusammen,

möchte eine neue Funktion vorstellen (noch nicht auf dev, noch in der finalisierung):

Problem: durch den Komfort von aktuellen Dateisystemen, haben immer wieder Dateien Sonderzeichen im Namen, die auf Fat32 einfach nicht erlaubt sind. Z.B. „?“ oder „:“ sieht man immer wieder.
Aktuell scheitert der Upload dann einfach.
Daher folgende Lösung:
Beim Zugriff auf das Filesystem ersetzen wir die Sonderzeichen durch eine URL-Codierung (z.B. wird „?“ zu „%3F“). Wenn wir auf Dateinamen zugreifen, wandeln wir es wieder zurück.
Habe das im FTP und Espuino so eingebaut und es scheint sehr gut zu funktionieren.

Gerne mal ausprobieren und Feedback geben, wenn ihr Lust habt.

So, mittlerweile ist es nicht mehr „draft“ :slight_smile: .
Viel Spaß damit.

Ich benutze kein FTP, deswegen habe ich nur mal drübergeschaut und mit der KI diskutiert - der PR ist auch eine Nummer zu Groß für mich :see_no_evil_monkey:

Ich habe dir meine Chatgpt-Konversation angehangen.

Es sollten folgende Punkte noch einmal angesehen werden (ich weiß die KI ist nicht die Allheillösung aber mittlerweile besser als ich):

  1. Laut der KI wird SanitizedFS::open(const String&) doppelt encodiert
  2. die reparse() verändert auch Dateinamen, welche auf anderem Weg auf den ESPUINO gekommen sind - dann wird aus folgender Datei a%2Fb.mp3 das da mit Pfadtrenner a/b.mp3
  3. Die KI hatte noch eine Performanceverbesserung zu const String illegal_chars = ":*?\"<>|%";
  4. Der SPI-SD-Pfad könnte brechen, dass muss man wahrscheinlich noch mal genauer betrachten (würde nur lolin_d32_pro betreffen)
  5. Das \ Backslash und DEL 0x7F sollte noch behandelt werden. Folgende sind wahrscheinlich unkritisch #, &, +, ;, =, Leerzeichen

PR Test und Review.pdf (389,1 KB)

Vielen Dank!
Das mit den zweiten Open ist tatsächlich ein Bug den ich übersehen habe.
Und das Pauschale reparsen lässt wirklich die Sonderfälle noch übrig. Das könnte man mutwillig ausnutzen.
Backslash ist bewusst nicht drin, da das für Pfade gilt, genauso wie slash. Und es geht hier nicht pauschal um Sonderzeichen (die können wir) sondern um die Limitierungen von Fat32, die ein unerfahrener User nicht erwartet.
Alles was nicht behandelt wird, wird weiterhin vom filesystem einfach abgelehnt.
Das mit dem Spi-SD halte ich für falsch, das sollte so sauber funktionieren.
Ich schau nochmal drüber und werde zumindest 1) und 2) noch fixen :slight_smile:

Danke für die schnelle Antwort.

Wie gesagt, ich überblicke das leider nicht.

Die KI sagte auch möglicher bruch beim Build

Möglicher Build-Break im SPI-SD-Fall

Im ursprünglichen SdCard.cpp existiert im Nicht-SD_MMC_1BIT_MODE-Zweig SPIClass spiSD(HSPI); und fs::FS gFSystem = (fs::FS) SD;. Im PR wird daraus #define HARDWARE_FS SD und SanitizedFS gFSystem(HARDWARE_FS);; die SPIClass spiSD(HSPI);-Definition ist im Diff nicht mehr sichtbar, während spiSD in SdCard_Init() weiterhin benutzt wird.

Das sollte unbedingt für alle PlatformIO-Umgebungen geprüft werden, nicht nur für SD_MMC. Falls spiSD nicht anderswo definiert ist, bricht mindestens der SPI-SD-Build.

Oh Mist. Total übersehen :smiley: .
Danke! Ja, das gehört da rein.
Ich schau nochmal in ruhe drüber. War wohl spät, als ich das fertiggestellt habe :slight_smile: