Neuigkeiten:

still alive...

Hauptmenü

Problem mit Bildupload-Skript

Begonnen von nena, 05. Dezember 2006, 11:59:23

Vorheriges Thema - Nächstes Thema

nena

Hallo Forum,
ich quäle mich mit meinem Bildupload-Code herum und komme einfach nicht dahinter, was hier nicht stimmt. Eigentlich müssten alle Funktionen korrekt sein - ich verstehe die Welt nicht mehr. Vielleicht kann sich das jemand, der etwas mehr von PHP versteht als ich, mal ansehen?
Ich poste hier mal meinen Code - ist leider recht lang, aber ich befürchte, wenn ich ihn gekürzt hier rein stelle, ist er einfach unvollständig und nicht nachvollziehbar (?):
if($_REQUEST[\'Submit\'])
{
$sDateiname = $_FILES[\'uploadedfile\'][\'name\'];
$tmp_name = $_FILES[\'uploadedfile\'][\'tmp_name\']; //temp. Dateiname
$dDatum = date(\"d.m.Y\");
   
$upload_dir = \"html/sp0607/code/img/gallery\";
   
echo \"Upload-Verzeichnis: \'\".$upload_dir.\"\'\";
         
//1. Fall: Die Datei existiert noch nicht ... wird hochgeladen:
if (!file_exists($upload_dir.\'/\'.basename($_FILES[\'uploadedfile\'][\'name\']))) {
$upload_dir = $upload_dir.\'/\'.basename($_FILES[\'uploadedfile\'][\'name\']);
     
//temporäres Verzeichnis
$_FILES[\'uploadedfile\'][\'tmp_name\'];
         
//Abfangen möglicher Fehler
if (!isset($uploadedfile)){exit;}
//Abfrage, ob der Upload der angebenenen Datei erfolgreich war
if(!is_uploaded_file($tmp_name))
{
echo \"Der Upload ist leider gescheitert!
\";
              switch($_FILES[\'uploadedfile\'][\'error\']){
  case 1: echo \"Die Datei überschreitet die maximale Größe von 2 Megabytes.\"; break;
  case 2: echo \"Die Datei überschreitet die maximale Größe von \" . $_REQUEST[\'MAX_FILE_SIZE\'] .\" Bytes.\"; break;
  case 3: echo \"Die Datei wurde nur teilweise übertragen.\"; break;
  case 4: echo \"Es wurde keine Datei ausgewählt.\"; break;}
exit;}//if(!is_uploaded_file($tmp_name))
else {
echo \"Upload geglückt.
\";
}
echo \"Ausgabe 1:\'\".$sDateiname.\"\'
\";
echo \"Ausgabe 2:\'\".$upload_dir.\"\'
\";
             
if(move_uploaded_file($_FILES[\'uploadedfile\'][\'name\'], $upload_dir))
{
echo \"Verschoben.\";
               
//Eintrag in tbldatei
$sSql = \"INSERT INTO tbldatei SET Dateiname = \'$sDateiname\', ErstelltAm = \'$dDatum\'\";
$bOk = mysql_query($sSql);
       
if ($bOk){
echo \"Die Datei \". basename( $_FILES[\'uploadedfile\'][\'name\']). \" wurde erfolgreich hochgeladen.\";
}
else {
echo \"Beim Hochladen der Datei ist ein Fehler aufgetreten. Bitte versuchen Sie es erneut.\";
}
}//if(move_uploaded
else{
echo \"Funktioniert noch nicht.
\";
}
}//if (!file_exists)
 
-> Ausgegeben wird Folgendes:
Upload-Verzeichnis: \'html/sp0607/code/img/gallery\'
Upload geglückt.
Ausgabe 1:\'lilla.jpg\'
Ausgabe 2:\'html/sp0607/code/img/gallery/lilla.jpg\'
Funktioniert noch nicht.
-> Wenn ich es richtig sehe, liegt das Problem also bei der Abfrage if(move_uploaded_file($_FILES[\'uploadedfile\'][\'name\'], $upload_dir)), aber ich verstehe einfach nicht, warum dann \"Upload geglückt.\" ausgegeben wird... Hat jemand eine Idee? Ich wäre wirklich dankbar /uploads/emoticons/icon_e_smile.gif.4a0acefcb917340d2c82e5239c009e6e.gif\" alt=\":)\" />

Powie

ich glaube du kommst da mit denen Verzeichnissen und relativen / absoluten Pfaden durcheinander.
Wenn du die relativ angeben möchtest, dann ausgehend von dem Verzeichniss wo das Scripot liegt. Ansonsten komplette Absolutre Pfade benutzen.
Abhängig davon b safe_mode auf off oder on steht, probiere mal mit copy() anstelle von move_uploaded_file() !

nena

Vielen Dank für deine Hilfe! Mit den Pfaden hat tatsächlich was nicht gestimmt. ..
Ausserdem hatte ich noch einen anderen Fehler: mit move_uploaded_file($_FILES[\'uploadedfile\'][\'tmp_name\'], $upload_dir)  funktioniert\'s /uploads/emoticons/icon_e_smile.gif.4a0acefcb917340d2c82e5239c009e6e.gif\" alt=\":)\" />

Mit den Pfaden hat tatsächlich was nicht gestimmt.[/quote]
Außerdem ist dein Code voller http://php-faq.de/q/q-race-condition.html\" rel=\"external nofollow\">Race Conditions (überall wo Du eine Eigenschaft des Uploads prüfst), an mindestens einer Stelle ist dein Code außerdem anfällig für SQL-Injection:
 

$sDateiname = $_FILES[\\\'uploadedfile\\\'][\\\'name\\\'];

 
Was sagt das http://de.php.net/manual/de/features.file-upload.php\" rel=\"external nofollow\">PHP-Manual:
$_FILES[\\\'userfile\\\'][\\\'name\\\']Der ursprüngliche Dateiname auf der Client Maschine.
[/quote]
Was machst Du, ohne den Dateinamen geprüft zu haben?

$sSql = \"INSERT INTO tbldatei SET Dateiname = \\\'$sDateiname\\\', ErstelltAm = \\\'$dDatum\\\'\";

all your base are belong to us / Discord