phpbar.de logo

Mailinglisten-Archive

[php] File Uploads ...

[php] File Uploads ...

Ralf Geschke ralf_(at)_kuerbis.org
Sun, 11 Apr 1999 22:21:51 +0200


> 
> 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 "&nbsp;<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