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