Thomaier: Sonderzeichen im Datei-Namen von GrafikenH

Hallo,
ich habe ein kleines Script, mit dem ich per PHP Bilder von Nummernschildern generieren lasse. Dabei sollen einmal erstellte Grafiken zum späteren Aufruf gespeichert werden. Das logischste ist mir dabei, die Aufschrift des Nummernschildes gleich für den Dateinamen zu verwenden. Das Problem sind nun die Sonderzeichen, die ja dabei vorkommen, hier konkret Leerzeichen, Doppelpunkt und Bindestrich. Die Aufzählung soll aber prinzipiell erweiterbar bleiben.
Ein Beispiel:
Die Aufschrift lautet: "A:L 4"
zur Umwandlung in einen nutzbaren Dateinamen nutze ich
$text = urlencode($text);
Das funktioniert auch sehr gut. Hier ist der Dateiname dann A%3AL+4.png.

Nun will ich die Datei wie folgt anzeigen:

$text = urlencode($text);  
echo "<img width='175' height='37' src='pics/$text.png' alt='[$text]'/>";

Das Bild wird jetzt aber nicht angezeigt. Nach mehrerem Experimentieren fiel es mir wie Schuppen von den Augen, dass die vorher kodierten Zeichen automatisch umgewandelt werden. Doch dann stimmen sie ja nicht mehr mit dem Dateinamen überein, der immer noch "urlencode" ist.
Gebe ich im Browser die Adresse des Bildes ein, erscheint:
Forbidden
You don't have permission to access pics/A:L+4.png on this server.

Ich will ungern alle möglichen Sonderzeichen mit einer eigenen Funktion in ein kompliziertes Format bringen, weiß aber keine andere Form, in die ich die Sonderzeichen bei der Speicherung umwandeln und später wieder auslesen kann.
Übrigens gibt file_exists(Pfad/Dateiname) TRUE aus. Gibt es denn eine Möglichkeit, Grafikdateien anders als mit <img> zuverlässig anzuzeigen?

Danke

  1. Hallo Thomaier,

    sieh Dir bitte base64_encode() und base64_decode() an!

    Gruß aus Berlin!
    eddi

    1. Hallo

      sieh Dir bitte base64_encode() und base64_decode() an!

      Danke, habe ich gemacht und wieder was gelernt. Trotzdem habe ich der Einfachheit halber die doppelte Codierung verwendet.

      Gruß
      T

    2. (Hallo|Hi(ho)|Nabend) Edgar Ehritt,

      sieh Dir bitte base64_encode() und base64_decode() an!

      Ähemm, gehört zum base64-Zeichenraum nicht der Slash "/", der in Dateinamen äußerst unpraktisch wäre?

      MffG
      EisFuX

      1. Hallo,

        sieh Dir bitte base64_encode() und base64_decode() an!

        Ähemm, gehört zum base64-Zeichenraum nicht der Slash "/", der in Dateinamen äußerst unpraktisch wäre?

        stimmt auffallend. RFC3548 gibt genau aus diesem Grund eine weitere Übersetzungstabelle an, die für Dateinamen sicher wäre. Scheint allerdings in der Praxis selten angewandt zu werden.

        Freundliche Grüße

        Vinzenz

  2. Nun will ich die Datei wie folgt anzeigen:

    $text = urlencode($text);

    echo "<img width='175' height='37' src='pics/$text.png' alt='[$text]'/>";

    Ääh kannst du bei der Anzeige nicht einfach doppelt escapen?  
    ~~~php
    $text = urlencode($text);  
    
    > echo "<img width='175' height='37' src='pics/".urlencode($text).".png' alt='[$text]'/>";
    
    

    Zum Speichern natürlich nur einmal :)
    Der Browser würde nun das bekommen:
    <img width='175' height='37' src='pics/A%253AL%252B4.png' alt='[A%3AL%2B4]'/>
    Und das dann "decoden" und folglich nach der Datei A%3AL%2B4.png suchen und den Alternativ-Text "[A:L+4]" ausgeben.

    --
    sh:( fo:| ch:? rl:( br:& n4:& ie:{ mo:} va:) de:µ_de:] zu:) fl:( ss:| ls:[ js:(
    1. Hallo,

      Ääh kannst du bei der Anzeige nicht einfach doppelt escapen?

      Ja, kann ich und es funktioniert auch. Ich suche aber noch nach einer Ausrede, warum ich da nicht selbst drauf gekommen bin. Ich probiere aber auch noch die anderen Tipps aus.

      Gruß
      T

  3. Hi!

    Die Aufschrift lautet: "A:L 4" zur Umwandlung in einen nutzbaren Dateinamen nutze ich $text = urlencode($text);
    Das funktioniert auch sehr gut. Hier ist der Dateiname dann A%3AL+4.png.

    Du hast hier eine URL-Kodierung für den Kontext Dateisystem "missbraucht". Das ist erstmal noch kein Problem.

    Nun will ich die Datei wie folgt anzeigen:

    $text = urlencode($text);

    echo "<img width='175' height='37' src='pics/$text.png' alt='[$text]'/>";

      
    Hier verwendest du den URL-kodierten Wert für die URL in src aber auch als normalen Text in alt. In alt ist das verkehrt, das ist kein URL-Kontext.  
      
    
    > Das Bild wird jetzt aber nicht angezeigt. Nach mehrerem Experimentieren fiel es mir wie Schuppen von den Augen, dass die vorher kodierten Zeichen automatisch umgewandelt werden.  
      
    Genau, aber "automatisch" ist wie "dynamisch" kein "zulässiges" Wort im Zusammenhang mit Programmieren, denn irgendwer muss die Funktionalität ja implementiert haben. Es passiert alles nur auf konkrete Anweisung hin und nicht "irgendwie von selbst". Du meinst in dem Fall, dass der Webserver den URL-Kontext liest und die dort kodierten Zeichen vor dem Weiterverarbeiten dekodiert. Damit geht deine URL-Kodierung verloren, die du eigentlich für das Dateisystem nutzen wolltest.  
      
    Base64- oder doppelte URL-Kodierung wären auch meine Vorschläge gewesen.  
      
      
    Lo!