Tom²: kleines Datei-Upload-Problem (Original-Dateiname...)

Hallo!

Ich hab da ein kleines Problem mit einem Datei-Upload-Skript:

Im Prinzip arbeitet das Skript wie in diesem Beispiel: http://www.dclp-faq.de/q/q-formular-upload-php4.html

Nun möchte ich aber, dass der Original-Dateiname (nach Überprüfung, ob die Datei schon existiert) übernommen wird (also auf dem Server so heisst, wie auf dem Datenträger, von dem sie hochgeladen wurde).

Auf der oben genannten Seite wird gesagt, dass man sich auf $_FILES['probe']['name'] nicht verlassen kann (wegen Laufwerksbuchstaben, Verzeichnissen...). Wie komme ich dann an den Dateinamen ran?
Es muss irgendwie gehen, denn in CONFIXX geht's auch (da ist zwar ein Feld für den Dateinamen auf dem Server, man kann das aber auch leer lassen).

Wer kann mir einen Tipp geben?

Danke!
Tom

  1. Halihallo Tom²

    Auf der oben genannten Seite wird gesagt, dass man sich auf $_FILES['probe']['name'] nicht verlassen kann (wegen Laufwerksbuchstaben, Verzeichnissen...). Wie komme ich dann an den Dateinamen ran?

    Der Dateiname, oder Dateiname+Pfad?
    Nun, bei Windows und Unix liesse sich der Dateiname über '' oder '/'
    finden (einfach alles nach dem _letzten_ '' oder '/').
    Bei Mac (MacOS<10 nehme ich an) wird's etwas komplizierter, denn da
    ist das Verzeichnistrennzeichen ein Doppelpunkt ':'.
    Folglich: Wenn du den Dateinamen herausfinden möchtest, dürfte sich
    "alles nach dem letzten '/' oder '' oder ':'" als zuverlässig
    erweisen.
    Aber da ein Doppelpunkt ein gültiges Zeichen eines Unix-Namens ist,
    könnte es wieder Probleme geben.

    Ich hab mal kurz unsere Mac's angeworfen und folgendes
    herausgefunden:

    Bei MacOS 9 und kleiner mit IE 5.5 und NS 7.1 werden - auch wenn die
    Datei in einem Unterverzeichnis liegt - weder Pfadangaben noch
    Laufwerksbezeichnungen übertragen. Der Dateiname entspricht also bei
    MacOS<=9 _genau_ $_FILES['probe']['name']. Bei anderen Browsern und
    MacOS10 weiss ich das nicht, aber falls sich dieses Schema bei allen
    Mac-Browsern und -Systemen bewahrheitet, kann man mit der Erkennung
    von '/' und '' IMHO nur noch bei VMS etwas falsch machen.

    Ach ja, an den Dateinamen kommst du mit Sicherheit. Das Problem ist
    der Pfad bzw. die Erkennung wo - falls vorhanden - dieser auf
    bestimmen Plattformen endet.

    Viele Grüsse

    Philipp

    1. Hello,

      $dateiname = basename($_FILES['probe']['name']); # sollte auf jeden fall den gewünschten Namen liefern. Man sollte allerdings aufpassen, dass der nicht leer ist.

      Harzliche Grüße aus http://www.annerschbarrich.de

      Tom

      --
      Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
      Nur selber lernen macht schlau
      1. Halihallo Tom

        $dateiname = basename($_FILES['probe']['name']); # sollte auf jeden fall den gewünschten Namen liefern. Man sollte allerdings aufpassen, dass der nicht leer ist.

        Oha, gibt's das sogar auch bei PHP... Schande über mich :-)
        Ich kannte das nur von Perl: File::Basename. Naja, das ist bestimmt
        die beste Methode. Danke für die Korrektur ;)

        Viele Grüsse

        Philipp

      2. Hallo!

        Danke für Eure Antworten! Also wenn ich echo $_FILES['probe']['name']; ausgebe, steht da der Dateiname ohne Verzeichnisse wie ich ihn haben möchte. Wenn ich nun überprüfen will, ob der Dateiname schon vorhanden ist [1], passiert gar nichts, auch wenn er schon vorhanden ist. Da ändert auch basename($_FILES['probe']['name']) nichts.

        Tom

        [1] if (file_exists($_FILES['probe']['name'])) { Fehlermeldung... }

        1. Hello,

          Denksportaufgabe:

          if (file_exists($path.basename($_FILES['probe']['name']))) ## das Basename gibt Schutz
          {
            #Fehlermeldung
          }
          else
          {
            # im aktuellen Verzeichnis existiert die Datei noch nicht
          }

          $path mit abschließendem Slash!

          Harzliche Grüße aus http://www.annerschbarrich.de

          Tom

          --
          Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
          Nur selber lernen macht schlau
          1. Hallo!

            if (file_exists($path.basename($_FILES['probe']['name'])))
            [...]
            $path mit abschließendem Slash!

            Das war's! Danke für den Tipp!

            Tom

        2. Halihallo Tom²

          Danke für Eure Antworten! Also wenn ich echo $_FILES['probe']['name']; ausgebe, steht da der Dateiname ohne Verzeichnisse wie ich ihn haben möchte.

          Nein, bei einem Windows-Rechner mit IE _wird_ das Verzeichnis z.B.
          mitgesendet!

          Wenn ich nun überprüfen will, ob der Dateiname schon vorhanden ist [1], passiert gar nichts, auch wenn er schon vorhanden ist. Da ändert auch basename($_FILES['probe']['name']) nichts.

          Falsch. Verwende basename! und wende darauf dann dein 'exist' an. Das
          ist die Plattform- und Browserunabhängige vorgehensweise.

          Viele Grüsse

          Philipp