moppelito am 29.10.2009 um 14:33 Uhr
Hi Leutz, ich hab jetzt ne stunde im I-Net geuscht und leute gefragt, doch die konnten mir keine richtige antwort geben... Hier meine Frage: wie kann ich in php bei einem upload scrip für jede neu hochgelade datei einen ordner erstellen in den die datei gescpeichert wir!d! ausser dem soll der ordner eine zahl sein also ordner 1 hat den namen: 1 ordner 2 den namen 2... ich konnte das herausfinden: $a = //hier kommt der befehl da der letzte ordner +1 genommen wird $new_path = mkdir ( '$a', 0700 );
wie mache ich das? Danke im vorraus moppelito^^
PS: ich will auf meinem.www.moppelito.tk das wenn man dort etwas hochläd nicht das direct in den "uploads" ordner getan wird um das überschrieben von daten verhindern.
mkdir( $a, 0700) wenn dann, denn entweder variable oder anführungszeichen.
da du nicht weisst was der letzte Ordner für eine Zahl hatte, musst du das verzeichnis sortiert durchsuchen (loop über read_dir) und am ende hat er ja das verzeichnis mit der höchsten Zahl. diese dann plus eins..

wenn es Dir wirklich nur darum geht, das keine Datei überschrieben wird, warum hängst Du dann nicht einfach eine Zahl an die Datei an. z.B. wenn es bild.gif schon gibt, heißt die neue Datei bild1.gif und wenn es die schon gibt bild2.gif usw. Hier mal ein Codeschnippsel der das leistet:
$uploaddir='/httproot/upload/'; //Verzeichnis für Upload
$filename=$_FILES['userfile']['name']; //Name der Datei, wie sie hochgeladen wurde
$ftype=strrchr($file,'.'); //Dateiende wie z.B. .gif, .jpg usw.
$fname=substr($file,0,strlen($file)-strlen($ftype)); //der Name der Datei ohne Endung
//solange die Datei existiert wird ein Counter hochgezählt und an den Dateinamen angehangen.
$a=0;
while(fileexists($uploaddir.$filename)){
$a++;
$filename=$fname.''.$a.$ftype;
}
//hier hast Du den Namen unter dem Du die Datei speichern kannst
echo $filename;
Lioxen am 29. Oktober 2009 16:35 ups der hat sämtliche Unterstriche gelöscht, sollte eigentlich heissen:
$filename=$fname.'unterstrich'.$a.$ftype;
aber Du kannst es auch weglassen, dann hängt er nur die Zahl an:
$filename=$fname.$a.$ftype;
moppelito am 29. Oktober 2009 17:00 Problem: wenn ich nach einer gweissen daei suche komme durcheinander mit ordnern wäre das einfacher, kann ich: $a++ $new_path = mkdir ( $a, 0700 );
????
Lioxen am 29. Oktober 2009 18:20 Da musst Du erst mal rausfinden, welche Zahl das letzte erstellte Verzeichnis überhaupt hat. Das könnte man auch in einer while Schleife abfragen. z.B.
$a=1;
while(file_exists($uploaddir.$a)){
$a++;
}
if(mkdir($uploaddir.$a)){
//weiter im Code
}
else{
echo 'Fehler beim Anlegen des Verzeichnisses';
}
das hat aber den Nachteil, dass je mehr Verzeichnisse schon angelegt sind um so länger braucht die Schleife. Außerdem wird das Probleme machen, wenn zufälligerweise mehrere Personen eine Datei hochladen wollen.
Genauso könnte man mit readdir das upload Verzeichnis auslesen. Da man da aber auch Dateien zurückbekommt und das Ergebnis nicht geordnet bekommt, muss man das im Nachhinein tun. Auch hier sehe ich aber ein Problem, wenn mehrere User zur gleichen Zeit eine Datei hochladen wollen.
Bleibt eigentlich nur, die Zahl in einer Datei zu speichern und beim lesen ein exclusive Lock zu legen. D.h. es kann nur eine Instanz auf die Datei zu einer bestimmten Zeit zugreifen. Alle anderen müssen warten.
z.B. so
$fp = fopen("./ordnerzahl.txt", "r+");
if (flock($fp, LOCKEX)) { // ein exclusive lock
while (!feof($fp)) {
$line=trim(fgets($fp, 1024));
}
ftruncate($fp, 0); // kürzt die Datei auf 0
rewind($fp); //Dateizeiger auf den Anfang
$newid=(int)$line+1;
fputs($fp,$newid); //schreibt die neue Zahl in die Datei
mkdir($upload.$line);
//hier der ganze kram um die Datei zu verschieben also
moveuploadedfile(...);
flock($fp, LOCKUN); // entfernt den Lock
}
else {
echo "Konnte kein Lock erhalten!";
}
Dann musst Du noch eine Datei ordnerzahl.txt in dem Ordner anlegen wo das Script liegt und dort eine 1 reinschreiben. Hinweis: die löschen immer die Unterstriche hier: das heißt LOCKunterstrichEX und LOCKunterstrichUN
moppelito am 30. Oktober 2009 18:30 was ist beid dir der uploaddir<??? ordner odeer hochgeladene datei^^
Lioxen am 2. November 2009 09:39 das ist eine Variable, die ich am Anfangs selbst vergeben habe(siehe ganz oben), da ich Deine Verzeichnisstruktur nicht kenne. Diese speichert den Pfad zu dem Verzeichnis in der alle hochgeladenen Dateien oder auch Ordner angelegt werden sollen.
kannsnt du mir das genauer beschreiben? bin grad am anfang von php^^ wie setzte ich dieses read_dir nach dem verzwichnis mit der höchsten zahl?