php upload Datei existiert Abfrage

ddbug

Grünschnabel
Hallo,
Ich suche nach einer Möglichkeit bei meinem Uploadscript vorher zu prüfen, ob eine Datei mit dem Namen bereits existiert. Momentan habe ich es mit
PHP:
if (file_exists("./$file_name")) 
  {echo "Fehler";}
realisiert. Hierbei ist aber das Problem, dass erst die Datei hochgeladen wird und dann erst gesagt wird, ob die Datei existiert. Für Modemuser ist das bei 1MB Dateien ziemlich nervig. Kennt da jemand ne Andere Lösung?

Gruß

Tobias
 
So "ad hoc" könntest Du bei jedem upload den Namen, MIME-Typ etc. (Was Du alles brauchen könntest) in einer DB ablegen.

Beim öffnen des Upload-Scripts machst Du einfach einen select auf die DB und holst Dir die relevanten Daten raus und speicherst sie in einem Array.

Nach dem übermitteln des Formulars (Meist "upload") überprüfst Du einfach, ob der Dateiname im Array vorhanden ist. Falls dies der Fall sein sollte gibst Du einfach eine Meldung aus.


Beste Grüße,
Claus
 
Hallo!

@Claus Gronemeier:
Das löst doch das Problem nicht!
Das Formularfeld muss ja trotzdem erst übermittelt werden - was ihm zu lange dauern kann.
Im Prinzip ist deine Idee nichts anderes, als die bereits vorhandene - bloß, dass man zusätzlich noch eine Datenbank braucht.

@ddbug:
Leider gibt es auch keine Möglichkeit VOR dem Submit des Formulars den Namen zu prüfen - woher soll das Script sonst den Namen kennen.
Da müsstest du den Namen schon in einem Vor-Formular den Namen per Hand eingeben lassen - das ist aber natürlich keine realistische Idee.

Ich würde es doch so machen, dass, wenn die Datei bereits existiert, einfach der Dateiname geändert wird.
So kannst du in diesem Fall ganz einfach z. B. ein "_001" an den Dateinamen anhängen.
Und wenn du dann die Datei - mit dem original Namen - ausgeben willst, nimmst du mittels Script die "_001" einfach wieder weg.
 
Vor dem Upload gehts auch...mit Javascript.
Du müsstest alle vorhandenen Dateinamen in einen Javascript-Array schreiben, und vor dem Senden des Formulars den
den Inhalt dieses Arrays nach dem entsprechenden Dateinamen durchsuchen:
PHP:
<html>
<head>
<script type="text/javascript">
<!--

<?php
$root='/';
$files=array();
$handle = opendir($root);
while($file = readdir($handle))
   {

   if(is_file($root.$file))
        {
        $files[].="'".$file."'";
        }
   }
closedir($handle);
echo 'files=new Array('.implode(',',$files).');';
?>

function chk_upload(frm)
{
file=frm.datei.value;
file=file.replace(/.*[\\\\\\/]/g,'');

for(i=0;i<files.length;++i)
    {
    if(file.toLowerCase()==files[i].toLowerCase())
        {
        alert('Die Datei\n´'+file+'´\nist bereits vorhanden!');
        return false;
        }
    }
return true;
}
//-->
</script>
</head>
<body>
<form onsubmit="return chk_upload(this)">
<input type="file"name="datei">
<input type="submit">
</form>
<!-- ? -->
</body>
</html>
Das ist natürlich nicht entgültig sicher...aber die einzige Möglichkeit, Modemusern wir mir:sad: Unannehmlichkeiten zu ersparen.
Es ist natürlich immer noch möglich, das zwischenzeitlich jemand anderes eine Datei dieses Namens hochgeladen hat, oder der Benutzer
Javascript deaktiviert hat... die müssen dann halt damit leben:-)
 
Ich denke das beste ist es, die Datei einfach hochzuladen. Dann liegt sie im temp-Ordner des Webservers und da liegt sie erstmal gut ;)

Nun prüfst du, ob der Dateiname schon existiert. Tut er das, dann gibst du ein Formular aus, in dem du den User aufforderst einen anderen Dateinamen für die Datei anzugeben und erst im nächsten Schritt verschiebst du die Datei an ihren endgültigen Punkt.

Der einzige mögliche Haken an der Sache könnte nur sein, dass der Webserver die temp-Dateien beim verlassen der Seite löscht, sprich, wenn du erst noch eine Formulareingabe machst, die Daten gar nicht mehr da sind. Aber da bin ich mir grade nicht sicher, da müsste sich nochmal jemand anders zu äussern und/oder du müsstest es probieren.
 
Hi,

also ich hab das eben mal kurz probiert und kam zu folgendem Ergebnis:

- das File existiert noch im temp-Ordner
- das kopieren aus dem temp-Ordner gestaltet sich hingegen als schwieriger, da move_uploaded_file() scheinbar nicht mehr ausgeführt werden kann - zumindest bekam ich keinerlei Rückgabewerte - sobald ich die Werte an ein anderes Skript übergeben hab.
copy() kann mit dem temp-Dateinamen nichts anfangen, da bräuchte ich den absoluten Pfad zum temp-Ordner - hab ich wohl Tomaten auf den Augen, zumindest will es absolut nicht klappen :suspekt:


Hab's jetzt so gelößt, dass ich das File in einem temp Ordner in meinem DocRoot ablege und dann kann ich im nächsten Schritt problemlos per copy() arbeiten :)
 
Oho, das ging ja fix!

Vielen Dank, upload_tmp_dir = no value, werd' ich am Wochenende mal experimentieren, heute Abend wird das glaub' ich nix, auf phpinfo() hätt' ich echt selber komme können :-(
 
Zurück