Upload-Script: wohin mit den Uploads?
Andreas
- php
Hallo,
ein User lädt eine Datei test.zip in einem Thread hoch. Datei wird in ein Verzeichnis kopiert. Der Nächste User kommt und nennt seinen Upload auch test.zip. Effekt ist dass die erste überschrieben wird.
Wie wird das normalerweise gemacht bzw. richtig gemacht??
Gruß Andreas
Hi,
ein User lädt eine Datei test.zip in einem Thread hoch. Datei wird in ein Verzeichnis kopiert. Der Nächste User kommt und nennt seinen Upload auch test.zip. Effekt ist dass die erste überschrieben wird.
Wie wird das normalerweise gemacht bzw. richtig gemacht??
Den Dateien werden eindeutige Namen (oder Pfade) gegeben.
cu,
Andreas
Hallo,
danke erst mal für die Antworten.
Die Dateien befinden sich nicht auf einem temporären Verzeichnis sondern auf der Platte beim User und werden in ein Verzeichnis im Netz kopiert.
Den Dateien werden eindeutige Namen (oder Pfade) gegeben.
Ich hätte aber schon gerne dass wenn die Datei wieder downgeloadet wird, dass der ursprüngliche Name vorhanden ist.
Bitte gebt mir doch noch ein bisschen Details, wie ich das machen könnte.
Das upload-Script sieht so aus:
$filesize = $_FILES['datei']['size'];
$mimetype = $_FILES['datei']['type'];
if ( isset($datei_name) ){
if ( $filesize<300000 ){
copy("$datei", "uploads/$datei_name");
$update = $SQL->putquery("UPDATE tbanswer SET uploadname = "$datei_name", uploadsize = '$filesize', mimetype = '$mimetype' WHERE date = '$tstamp'");
$filesizeErr = "";
}
else{
$filesizeErr = "Dateigröße von 300000 Byte wurde überschritten<br>Datei wurde nicht geladen";
}
}
Die Verarbeitung des downloads (hier nur für .zip) sieht so aus:
if ( isset($th_uploadname) ){
if ( $th_mimetype == "multipart/x-zip" || $th_mimetype == "application/zip" || $th_mimetype == "application/x-zip-compressed")
print "$th_mess<br><br><img src='$DIRimage/zip.gif'>Anhang: <a class='a' href='download.php?linkdat=$th_uploadname&id=$th_id&Thread=1'>$th_uploadname</a><br><div class = "small3">($th_uploadsize Byte) $th_DownloadString</div><P>$us_sig\n</TD></TR>\n";
}
in Download.php steht dann folgendes:
$download = "http://www.access-o-mania.de/forum/uploads/$linkdat";
$mimetype = $_FILES[$linkdat]['type'];
header("Content-Type: $mimetype");
header("Location: $download");
Gruß Andreas
Hi Andreas ,
ein User lädt eine Datei test.zip in einem Thread hoch. Datei wird in ein Verzeichnis kopiert. Der Nächste User kommt und nennt seinen Upload auch test.zip. Effekt ist dass die erste überschrieben wird.
Wie wird das normalerweise gemacht bzw. richtig gemacht??
indem Du den Namen, für das File vergibst. Beim Upload kopierst Du ja die Datei aus dem Tempverzeichnis in ein Neues und benennst dabei die neue Datei, an der Stelle hängst Du entweder eine Nummer dran oder machst generell eine Nummer draus oder, wenn vorhanden, nimmst du den Benutzernamen + Nummer als neuen Namen.
ciao
romy
Hallo,
ein User lädt eine Datei test.zip in einem Thread hoch. Datei wird in ein Verzeichnis kopiert. Der Nächste User kommt und nennt seinen Upload auch test.zip. Effekt ist dass die erste überschrieben wird.
Wie wird das normalerweise gemacht bzw. richtig gemacht??
Eigene Namen vergeben wurde schon gesagt... du musst da natürlich auch schauen das es keine race contitions gibt (Überschneidungen bei gleichzeitigen Uploads, der name muss eindeutig sein).
Eine vielleicht interessante Variante zum Upload in eine DB hab ich mal hier beschrieben:
http://i-netlab.de/cgi-bin/index.cgi?display=40.9
... dürte aber eher in einem intranet interessant sein wo auf einer gut bestückten Maschine nur 1..3 virtuelle hosts liegen und die Bandbreite im Netz vom Client bis zum server 100MBit/s gegeben ist, zumindest bei größeren Dateien.
Viele Grüße, Rolf
Hallo,
was hält ihr davon, wenn ich beim upload das Datum/Zeit vor den Upload-Name stelle? Wäre halt ein Restrisiko, dass in der gleichen Sekunde zwei Dateien mit gleichem Namen upgeloadet werden. Ich denke das ist aber total vernachlässigbar.
Im Downloadscript könnte ich das Datum vor dem Dateinamen entfernen, da das Datum eine konstante Länge von 14 Stellen hat.
Glaubt ihr das macht Sinn?
Gruß Andreas
hallo andreas,
habe mir folgendes gedacht und ca. so mache ich es auch in der regel.
der code der jetzt folgt ist von miur nicht getest und so auf die schnelle geschrieben. deshalb nicht wundern falls er nicht klappen sollte, allerdings kannst du anhand dieses codes wenigstens sehen was ich meine und es für dich abändern ;)
gruß urmel
...
//schauen ob Datei existiert
function datei(){
global $pfad;
global $dateiname;
while(!@(file_exists($pfad.$dateiname)){
$dateiname = (time()).$dateiname;
}
return $dateiname;
}
//schreiben der Datei
umask(077);
$dateihandle = fopen($pfad.(datei()),"w");
...
Hallo Urmel,
folgende Zeilen kapier ich nicht (PHP-DAU)
umask(077);
$dateihandle = fopen($pfad.(datei()),"w");
Nochmal zur Verständnis:
die Datei wird nicht von einem Verzeichnis oder Link upgeloadet, sondern von der Platte des Users upgeloadet. Ich verstehe dabei nicht was ich mit fopen($pfad... machen soll.
Gruß Andreas
Hallo Urmel,
folgende Zeilen kapier ich nicht (PHP-DAU)umask(077);
$dateihandle = fopen($pfad.(datei()),"w");Nochmal zur Verständnis:
die Datei wird nicht von einem Verzeichnis oder Link upgeloadet, sondern von der Platte des Users upgeloadet. Ich verstehe dabei nicht was ich mit fopen($pfad... machen soll.Gruß Andreas
rein garnix, es dient hierbei nur als beispiel, dachte das wäre klar ;)
aber da um korrektnis gebeten wird will ich das auch sein.
gleicher code neues glück:
statt:
umask(077);
$dateihandle = fopen($pfad.(datei()),"w");
lautet die funktion:
...
//schauen ob Datei existiert
function datei(){
global $pfad;
global $dateiname;
while(!@(file_exists($pfad.$dateiname)){
$dateiname = (time()).$dateiname;
}
return $dateiname;
}
//schreiben der Datei
move_uploaded_file($_FILES['userfile']['tmp_name'], $pfad.(datei()));
...
hoffe dir wird jetzt klar was ich vorhin damit ausdrücken wollte ;)
gruß urmel
Hallo urmel,
danke für die Antwort.
Muss mich mal jetzt an die Arbeit machen.
Gruß Andreas