Mailinglisten-Archive |
> > Zunächst muß bei meinem Host eine Datei die Endung php3 haben, > wenn sie abgearbeitet werden soll. Also habe ich die Datei > upload.php3 genannt, entsprechend "ACTION="upload.php3"" Gut so. Ansonsten die Einstellungen in httpd.conf bzw. srm.conf aendern. > Es sieht so aus, als hätte dies auch geklappt. > > Die Beschreibung redet von $userfile, das Script zeigt an z.B. > "File: /tmp/php04792aaa" > > Diese Datei kann ich nicht finden. Ein Verzeichnis /tmp gibt es > nicht, habe ich angelegt, immer noch nichts. Mein Host stellt ein > Verzeichnis /anonftp zur Verfügung, darin ein Unterverzeichnis > /incoming mit den nötigen Rechten. Nun, die Upload-Funktion von PHP haengt nicht mit FTP zusammen. Normalerweise findet sich eben in /tmp/phpsonstwas die Datei - Einstellungen wie safe_mode in php3.ini koennen dies jedoch verhindern. Vielleicht erstmal schauen, ob Uploads auf Deinem Rechner ueberhaupt erlaubt sind. Der Rest wird bei mir von Funktionen bewerkstelligt, eine schreibt das Upload-Formular, hier ein Auszug: print "<FORM ENCTYPE=\"multipart/form-data\" ACTION=\"$PHP_SELF\" METHOD=POST>"; print "<INPUT TYPE=\"hidden\" name=\"MAX_FILE_SIZE\" value=\"10000000\">"; print "<input type=\"hidden\" name=\"act\" value=\"upload\">"; print "<input type=\"hidden\" name=\"relpath\" value=\"$relpath\">"; print "Datei wählen:<br><INPUT NAME=\"userfile\" TYPE=\"file\">"; print " <INPUT TYPE=\"submit\" VALUE=\"Upload\">"; print " </FORM>"; Also ein Formular mit dem richtigen ENCTYPE, Action waere bei Dir wohl upload.php3, die Angaben in den hidden-Feldern sind optional, hier wichtig fuer den Ablauf meiner Funktion, so dient $relpath dazu, dass der Nutzer nicht in jedes beliebige Verzeichnis schreiben darf, sondern nur relativ zu einem, was vor Aufruf der eigentlichen Upload-Funktion festgelegt wird. Der Aufruf sieht folgendermassen aus: switch ($act) { case "upload": proc_upload($basedir,$relpath,$userfile,$userfile_name,$userfile_size); break; } $basedir ist davor bereits gesetzt, $relpath s.o., wichtig sind die letzten drei Variablennamen, welche von PHP gesetzt und initialisiert werden. $userfile ist der Name der temporaeren Datei, $userfile_name ist der _Original_-Name, welchen die Datei auf dem System des "Uploaders" hatte, $userfile_size ist die entsprechende Groesse. Es gibt noch $userfile_type, aber lassen wir dies mal beiseite. Der Rest geschieht hiermit (Zeilenumbrueche bitte vernachlaessigen): function proc_upload($basedir,$relpath,$userfile,$userfile_name,$userfile_size) { print "userfile: $userfile . <br>\n"; print "userfile_name: $userfile_name <br>\n"; print "userfile_size: $userfile_size <br>\n"; print "basedir: $basedir <br>"; print "relpath: $relpath <br>"; $completedir = $basedir . $relpath . "/" . $newdir; $completedir = eregi_replace("\/+","/",$completedir); print "complete: $completedir<p>"; if ($userfile_size > 0) { if (!copy($userfile,$completedir . $userfile_name)) { print "Warnung: Kopieren nicht erfolgreich!<br>\n"; } if (!unlink ($userfile)) { print "Warnung: Löschen der temporären Datei nicht möglich!<br>\n"; } } else return 0; return 1; } $basedir und $relpath auch erstmal beiseite lassen. Wichtig sind die drei $userfile*-Variablen. Wenn nach scheinbar erfolgreichem Upload in denen nichts enthalten ist, liegt der Fehler woanders. Der Rest ist Routine: Wenn wirklich etwas upgeloadet (autsch ;-)) wurde, also die Groesse > 0, dann Kopie an die richtige Stelle und Loeschen der temporaeren Datei. Die Funktion ist als Prototyp zu verstehen, eine Anpassung sollte jedoch nicht mehr schwer fallen. Gruss, Ralf -- / ralf_(at)_kuerbis.org -> http://www.kuerbis.org / ralf_(at)_infosoc.uni-koeln.de -> http://infosoc.uni-koeln.de/~geschke/
php::bar PHP Wiki - Listenarchive