Überprüfung auf die Existenz einer Pfadangabe
Wolfgang Peterknecht
- php
Liebes Forum,
ich habe ein Uploadscript gebaut, mit dem Besucher Bilder auf meinen Server laden können. Dazu habe ich ein Formular erstellt mit einigen Input-Feldern mit denen die gewünschten Dateien definiert werden. Wenn jetzt jedoch ein Pfad auf dem Rechner des Besuchers nicht existiert oder ganz einfach keine gültige Adresse angegeben wurde bekomme ich eine Fehlermeldung, da ich alle eingehenden Files erst einmal mit der Funktion getimagesize(); auf ihren Dateityp usw. überprüfe. Wenn getimagesize(); jedoch eine ungültige Bildadresse gelieft bekommt, gibt es folgende Fehlermeldung aus:
Warning: getimagesize(): Read error! in /kunden/.../upload.php on line 3
über die Aussage dieser Meldung bin ich mir bewusst, würde aber gerne wissen wie man verhindern kann, dass Benutzer dem Programm falsche Pfadangaben oder nicht existierende Bilder schicken. Gibt es da eine Überprüfung ob der Pfad existiert ? Man könnte dem Benutzer dann ausgeben das er eine falsche Pfadangabe geliefert hat oder sich vielleicht einfach nur vertippt hat. Aber erst einmal müsste ich dies überprüfen...
Würde mich sehr über sinnvolle Antworten freuen
Mit freundlichen Grüßen
Wolfgang Peterknecht
habe d'ehre
Warning: getimagesize(): Read error! in /kunden/.../upload.php on line 3
über die Aussage dieser Meldung bin ich mir bewusst, würde aber gerne wissen wie man verhindern kann, dass Benutzer dem Programm falsche Pfadangaben oder nicht existierende Bilder schicken. Gibt es da eine Überprüfung ob der Pfad existiert ?
Was spricht gegen
if(file_exists("$pfad/$datei"))
tue das
else
Ausgabe Fehler
man liest sich
Wilhelm
Hallo Wilhelm,
ich danke ihnen. Ich konnte mein Problem lösen. Kann man mal sehen, dass man mit wenigen Handgriffen einige Sachen wirklich gravierend umlenken kann.
DANKE
Mit freundlichen Grüßen
Wolfgang Peterknecht
Hallo Wilhelm,
ich konnte das Problem zwar lösen, doch jetzt sind sind die Variablen in denen die Funktion getimagesize(); steht durch die if-Anweisung nicht mehr gültig, d.h. es kann nicht mehr darauf zugegriffen werden:
if(file_exists($_FILES['localfile']['name'][0])) { $size1 = GetImageSize ($_FILES['localfile']['tmp_name'][0]); }
wenn ich jetzt angebe
if($size1[2]=="2") { echo("Es ist ein JPEG!"); }
...kann auf die Variable $size1 nicht mehr zugegriffen werden, da eine if-Anweisung dies verhindert.
Ich hoffe ihr könnt mir helfen
Mit freundlichen Grüßen
Wolfgang Peterknecht
Moin Wolfgang,
if(file_exists($_FILES['localfile']['name'][0])) { $size1 = GetImageSize ($_FILES['localfile']['tmp_name'][0]); }
kann es daran liegen, dass du einmal name und das andere mal tmp_name benutzt?
Grüße
Mike
hi,
abgesehen von dem was Mike sagte:
wenn du die grösse nicht mit getimagesize ermitteln konntest, weil schlicht und einfach gar kein bild hochgeladen wurde, dann ist es auch vollkommen sinnfrei, die abfrage
if($size1[2]=="2") { echo("Es ist ein JPEG!"); }
noch zu machen - also warumn machst du sie dann noch?
(du hast bereits die möglichkeit gefunden, getimagesize nur unter bestimmten umständen aufzurufen - also warum greifst du auf $size1 nicht nur dann zu, wenn die gleichen umstände zutreffen?)
gruss,
wahsaga
Hi wahsaga,
ich glaube du hast mich noch nicht gant verstanden.
if(file_exists($_FILES['localfile']['name'][0])) { $size1 = GetImageSize ($_FILES['localfile']['tmp_name'][0]); }
Wenn das Bild existiert, dann erlaubt die if-Anweisung das die Variable $size1 den und den Wert hat (Die Variable $size1 wird freigegeben für das Script). Aber wenn ich jetzt ein echtes Bild habe was ich hochladen möchte, dann kann das Script nicht auf diese Variable $size1 zugreifen obwohl sie durch die Existenz des Bildes freigegeben wurde.
MFG
Wolfgang Peterknecht
Hallo Forumer,
ich hab das Problem für euch noch ein wenig erleichtert. Versucht euch mal bitte an diesem Quelltext:
if(file_exists($_FILES['localfile']['name'][0])) { $size1 = GetImageSize ($_FILES['localfile']['tmp_name'][0]); }
if($size1[2]=="1") { echo("Es ist ein GIF!"); }
else { echo("Es ist kein GIF!"); }
Da diese Zeilen nicht funktionieren, kann das ganze Script nicht mit der file-exists-Taktik fehlerfrei ablaufen.
Habt ihr ne andere Lösung oder ein Verbesserungsvorschlag ?
MFG
Wolfgang Peterknecht
Moin Wolfgang,
du hast diese Frage noch nicht beantwortet:
kann es daran liegen, dass du einmal name und das andere mal tmp_name benutzt?
if(file_exists($_FILES['localfile']['name'][0])) { $size1 =
^^^^
GetImageSize ($_FILES['localfile']['tmp_name'][0]); }^
^^^^^^^^
Grüße
Mike
Hallo Mike,
nein, da dann eine Fehlermeldung kommt!
MFG
Wolfgang Peterknecht
Hallo Mike,
if(file_exists($_FILES['localfile']['name'][0])) { $size1 = GetImageSize ($_FILES['localfile']['tmp_name'][0]); }
ich weis jetzt woran es liegen könnte:
PHP kann nicht den Dateinamen $_FILES['localfile']['name'][0] auf dem Rechner des Benutzers wiederfinden, deshalb wird in jedem Fall FALSE zurückgegeben und die Variable mit der Funktion getimagesize(); kommt nicht zur Geltung. Ich brauch also genau die Angabe die auch im Formular vom Benutzer eingegeben wurde inkl. Pfadangaben usw. Aber da ich ja einen enctype="multipart/form-data" definiert habe wird kein String ausgegeben sondern einfach nur eine Datei. Ich kann also nicht mehr überprüfen was vom Benutzer im Formular angegeben wurde. Habt ihr vielleicht ne Idee wie man dies lösen könnte und somit die Datei auf dem Rechner des Benutzers später auf seine Existenz überprüfen könne ?
MFG
Wolfgang Peterknecht
habe d'ehre
Ich brauch also genau die Angabe die auch im Formular vom Benutzer eingegeben wurde inkl. Pfadangaben usw. Aber da ich ja einen enctype="multipart/form-data" definiert habe wird kein String ausgegeben sondern einfach nur eine Datei.
Frage: Verstehe ich Dein Ansinnen richtig?
Ein User soll von seiner lokalen Platte/CD eine Grafik auf Deinen Webserver laden und Du pruefst nach "senden" die eingegebenen Infos via PHP.
Wie bitte willst Du mit einem Serverprogramm auf einen lokalen Rechner zugreifen?
Ich verstehe ueberhaupt, warum der User einen Pfad und Dateinamen manuell eingeben muss.
Stelle einfach ein Feld <input type="file"> mit automatisch integrierter Browse-Funktion zur Verfuegung und pruefe den uebermittelten String auf das Vorkommen von .gif, .jpeg, .jpg, .png
Dann brauchst Du kein "file_exists" und den "getimagesize" nur fuer die Pruefung, ob eine bestimmte Dateigroesse ueberschritten wird.
Sollte ich voellig auf dem Holzweg sein, tja, dann solltest Du Dein Problem spezifizieren.
man liest sich
Wilhelm
habe d'ehre
Dann brauchst Du kein "file_exists" und den "getimagesize" nur fuer die Pruefung, ob eine bestimmte Dateigroesse ueberschritten wird.
Vergiss diesen Satz. :-)
attribute bei <input type="file">
maxlength="12345 " - maximale groesse der Datei
accept="image/*" - Mime Type images (alle)
accept="image/gif, image/jpg" - nur die beiden
man liest sich
Wilhelm
Hallo Wilhelm,
Dann brauchst Du kein "file_exists" und den "getimagesize" nur fuer die Pruefung, ob eine bestimmte Dateigroesse ueberschritten wird.
Vergiss diesen Satz. :-)
attribute bei <input type="file">
maxlength="12345 " - maximale groesse der Datei
accept="image/*" - Mime Type images (alle)
accept="image/gif, image/jpg" - nur die beiden
Und das funktioniert in Browsern? Außerdem lässt sich das doch mit einem manipulierten Formular oder einem schnell gestrickten Skript leicht aushebeln. Imho kommt man nicht um eine serverseitige Prüfung herum.
Gruß Alex
habe d'ehre
Und das funktioniert in Browsern? Außerdem lässt sich das doch mit einem manipulierten Formular oder einem schnell gestrickten Skript leicht aushebeln. Imho kommt man nicht um eine serverseitige Prüfung herum.
Das die Datei zusaetzlich gecheckt werden muss, sorry, so etwas setze ich voraus. ;-)
Was willst Du wie aushebeln?
man liest sich
Wilhelm
Hallo Wilhelm,
[Attribute maxlength und accept für input type="file"]
Das die Datei zusaetzlich gecheckt werden muss, sorry, so etwas setze ich voraus. ;-)
Was willst Du wie aushebeln?
Na die Attribute im Formular. :)
Einfach Seite im Editor entsprechend bearbeiten (Attribute auf die gewünschten Werte setzen) und lokal speichern. Dann lokale Datei aufrufen, Formular ausfüllen und absenden. Zur Not muss ich meinen Browser noch anweisen einen entsprechenden Referrer zu senden. Einfacher ist es natürlich, gleich einen Browser zu verwenden, der diese Attribute nicht interpretiert, bzw. sich vor allem nicht daran hält (wie z. B. Mozilla 1.3 :)).
Gruß Alex
Hallo Wilhelm,
http://www.visionofescaflowne.de/scripts/fanarts/define_files.php
so jetzt gib dort in das Formular einen Dateinamen an den es eigentlich gar nicht gibt (z.B.: test oder bild). Dann wird PHP dir eine Fehlermeldung ausspucken, die ich gerne ausblenden würde.
Vielleicht erläutert dies meine Frage ei wenig mehr
MFG
Wolfgang Peterknecht
Hallo Wolfgang Peterknecht,
http://www.visionofescaflowne.de/scripts/fanarts/define_files.php
so jetzt gib dort in das Formular einen Dateinamen an den es eigentlich gar nicht gibt (z.B.: test oder bild). Dann wird PHP dir eine Fehlermeldung ausspucken, die ich gerne ausblenden würde.
Diese Fehlermeldung hat aber nichts mit dem falschen Dateinamen zu tun, den irgendwer in das Formular eingibt, sondern mit Deiner ungenügenden Prüfung.
Lass Dir mal den Inhalt von $_FILES mit print_r() ausgeben. Dann siehst Du vielleicht eher, welche Schlüssel Du zur Prüfung des Uploads verwenden solltest.
Gruß Alex
Hallo AlexBausW,
ich habe mir mal den Inhalt der Vaiablen $_FILES ausgeben lassen. Rausgekommen ist ein Zahlensalat lol:
Array ( [localfile] => Array ( [name] => Array ( [0] => char_allen.jpg [1] => [2] => [3] => [4] => [5] => ) [type] => Array ( [0] => image/pjpeg [1] => [2] => [3] => [4] => [5] => ) [tmp_name] => Array ( [0] => /tmp/phpdRB4uM [1] => [2] => [3] => [4] => [5] => ) [error] => Array ( [0] => 0 [1] => 4 [2] => 4 [3] => 4 [4] => 4 [5] => 4 ) [size] => Array ( [0] => 5110 [1] => 0 [2] => 0 [3] => 0 [4] => 0 [5] => 0 ) ) )
mir ist schon klar was dies zu bedeuten hat nur leider weis ich nicht warum dies meine Frage beantworten soll.
MFG
Wolfgang Peterknecht
Hallo Wolfgang Peterknecht,
ich habe mir mal den Inhalt der Vaiablen $_FILES ausgeben lassen. Rausgekommen ist ein Zahlensalat lol:
Wenn Du es zwischen <pre> und </pre> gepackt oder aus dem Quelltext kopiert hättest, würde es nicht so nach "Salat" aussehen.
Ich habe mir mal die Mühe gemacht, das zu formatieren und von überflüssigen Angaben zu befreien:
Array (
[localfile] => Array (
[name] => Array (
[0] => char_allen.jpg
)
[type] => Array (
[0] => image/pjpeg
)
[tmp_name] => Array (
[0] => /tmp/phpdRB4uM
)
[error] => Array (
[0] => 0
)
[size] => Array (
[0] => 5110
)
)
)
mir ist schon klar was dies zu bedeuten hat nur leider weis ich nicht warum dies meine Frage beantworten soll.
Vielleicht wird es ja jetzt offensichtlicher, worauf ich hinaus wollte, vor allem wenn Du noch http://de.php.net/manual/de/features.file-upload.php zu Rate ziehst. Dann siehst Du sicherlich ein, daß man mit (auch wieder freundlicherweise für Dich formatiert):
if ( file_exists( $_FILES['localfile']['name'][0] ) ) {
^^^^
$size1 = GetImageSize( $_FILES['localfile']['tmp_name'][0] );
^^^^^^^^
}
if ( $size1[2] == "1" ) {
echo( "Es ist ein GIF!" );
}
else {
echo( "Es ist kein GIF!" );
}
nicht die Existenz einer hochgeladenen Datei prüfen kann.
Gruß Alex
P.S.: Es wäre (sicherlich nicht nur) imho hilfreich, wenn Du Deinen Code und Deine Ausgaben besser formatieren würdest, damit der geneigte Helfer nicht "überfordert" wird und deshalb gleich von Hilfe absieht.
Nochmalmich,
So sollte es aussehen:
$_FILES['localfile']['tmp_name'][0] );
^^^^^^^^
M***-Textareaumbrüche ;)
Gruß Alex
Moin Wolfgang,
Gibt es da eine Überprüfung ob der Pfad existiert ? Man könnte
ergänzend zu Wilhelm, die Prüfung ob ein Verzeichnis existiert:
if ( is_dir ($Pfad) )
Grüße
Mike