wtf2: Überprüfen, ob Datei vorhanden ist

<?php  
$target_path = "uploads/";  
$target_path = $target_path . basename( $_FILES['uploadedfile']['name']);  
  
$filename = '/usr/export/www/hosting/hgdomusik/uploads/$target_path);  
  
if (file_exists($filename)) {  
    print "Die Datei $filename existiert bereits. Wähle bite einen anderen Dateinamen!";  
} else{  
if(move_uploaded_file($_FILES['uploadedfile']['tmp_name'], $target_path)) } {  
    echo "Die Datei ".  basename( $_FILES['uploadedfile']['name']).  
    " wurde erfolgreich hochgeladen!";  
} else{  
    echo "Es gab einen Fehler während der Übertragung der Datei, versuch es nochmal!";  
}  
?>

Ich will überprüfen, ob die Datei, die hochgeladen wird, bereits im Verzeichnis "/usr/export/www/hosting/hgdomusik/uploads/$target_path)" vorhanden ist. Es soll verhindert werden, dass die Datei, die hochgeladen wird, die bereits vorhandene Datei ersetzt.

Daher habe ich folgenden Befehl:
$filename = '/usr/export/www/hosting/hgdomusik/uploads/$target_path);

if (file_exists($filename)) {
    print "Die Datei $filename existiert bereits. Wähle bite einen anderen Dateinamen!";
} else{...(mit dem Upload fortfahren)

Es klappt aber irgendwie nicht...

  1. Hi,

    Daher habe ich folgenden Befehl:
    $filename = '/usr/export/www/hosting/hgdomusik/uploads/$target_path);

    Es klappt aber irgendwie nicht...

    Wenn du es wirklich so geschrieben hast, sollte wohl klar sein, dass das „nicht klappt“.

    Und das wir „klappt nicht“ hier nicht für eine brauchbare Fehlerbeschreibung halten, sollte auch klar sein - erstens nach gesundem Menschenverstand, und zweitens nach den Tipps für Fragende, die gelesen zu haben du bestätigt hast.

    MfG ChrisB

    --
    “Whoever best describes the problem is the person most likely to solve the problem.” [Dan Roam]
  2. Hallo,

    $filename = '/usr/export/www/hosting/hgdomusik/uploads/$target_path);

    da ist eine Klammer .......... das ist nuex!

    if (file_exists($filename)) {
        print "Die Datei $filename existiert bereits. Wähle bite einen anderen Dateinamen!";

    Wobei ich das Unsinnig finde. Ergaenze den Namen so das man erkennt das es die zweite oder x-te Version ist.
    Mich wuerde es Aergern wenn ich durch meine Modemleitung die 250KB Bild gequaelt habe und von Dir kommt so eine Antwort.

    Es klappt aber irgendwie nicht...

    Die Fehlermeldung(en) oder die Auszuege aus den Protokollen helfen...erst Dir... spaeter hier!

    bis dann

    Ulli

    1. Hello,

      Mich wuerde es Aergern wenn ich durch meine Modemleitung die 250KB Bild gequaelt habe und von Dir kommt so eine Antwort.

      Das ist doch nur eine Frage, wie man den Vorgang gestaltet.

      1. Schritt: Session eröffnen
      2. Schritt: Datei hochladen mit Namenswunsch
      3. Schritt: prüfen, ob Datei unter dem Namen abgelegt werden kann
             wenn ja: ablegen und Quittung
             wenn nein: ablegen unter vom System bestimmten Namen
                        Name in der Session merken
                        Fehlanzeige und neue Namensanforderung
         4. Schritt     mit neuem Wunschnamen die Prüfung erneut durchlaufen
                        bei Erfolg: Dateiname aus der Session umbenenen durch eigenen
                                    bei Erfolg: Ende und Quittung
                        bei Misserfolg: Schritt 4 wiederholen

      Ende

      Liebe Grüße aus dem schönen Oberharz

      Tom vom Berg

      --
       ☻_
      /▌
      / \ Nur selber lernen macht schlau
      http://bergpost.annerschbarrich.de
  3. moin,

    Ich will überprüfen, ob die Datei, die hochgeladen wird, bereits im Verzeichnis "/usr/export/www/hosting/hgdomusik/uploads/$target_path)" vorhanden ist. Es soll verhindert werden, dass die Datei, die hochgeladen wird, die bereits vorhandene Datei ersetzt.

    Eine sportliche Programmierübung, aber für die Praxis ist das bereits im Ansatz unbrauchbar. Deswegen:

    print "Die Datei $filename existiert bereits. Wähle bite einen anderen Dateinamen!";

    Hier müsste der Besucher einen Dateinamen erraten, den es noch nicht gibt auf dem Server. Willst Du das wirklich!? Besser Du nimmst die Namenvergabe selbst in die Hand. Im einfachsten Fall kriegt die Datei nur eine Nummer; der Prozess setzt dazu ein exclusive Lock auf das Verzeichnis und schwubbs wird das Auszählen atomar sowie die Nummer eindeutig.

    Sch?ne Gr???e,
    Hott?

  4. Hello,

    Ich will überprüfen, ob die Datei, die hochgeladen wird, bereits im Verzeichnis "/usr/export/www/hosting/hgdomusik/uploads/$target_path)" vorhanden ist. Es soll verhindert werden, dass die Datei, die hochgeladen wird, die bereits vorhandene Datei ersetzt.

    Dann kannst Du das mittels passendem Modus beim Öffnen einer NEUEN Datei einstellen:

    $fh = fopen($dateiname, 'xb+);

    siehe: http://de.php.net/manual/en/function.fopen.php

    Die Funktion http://de.php.net/manual/en/function.move-uploaded-file.php gibt diese Möglichkeit nicht.

    Ein vorheriges Prüfen mit file_exists() ist sachlich falsch, da Du Dir damit ein TOCTOU-Problem baust.
    http://en.wikipedia.org/wiki/Time-of-check-to-time-of-use

    In einer Multiuserumgebung könnte es nämlich durchaus sein, dass sich zwischen Deine Prüfung mit file_exists() und das anschließende Kopieren des Files ein anderer Prozess gedrängelt hat, der das File ebenfalls angelegt hat. Du würdest dieses dann wieder überschreiben.

    Wird nun in der DB nur der Filename für den Owner eingetragen, hat diese Datei plötzlich zwei Owner mit dem Inhalt des letzten Prozesses, der geschrieben hat.

    Liebe Grüße aus dem schönen Oberharz

    Tom vom Berg

    --
     ☻_
    /▌
    / \ Nur selber lernen macht schlau
    http://bergpost.annerschbarrich.de