kleines Datei-Upload-Problem (Original-Dateiname...)
Tom²
- php
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
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
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
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
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... }
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
Hallo!
if (file_exists($path.basename($_FILES['probe']['name'])))
[...]
$path mit abschließendem Slash!
Das war's! Danke für den Tipp!
Tom
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