Teil von  SELFPHP   Teil von  Praxisbuch  Teil von  Dateisystem via PHP
Letztes Update: 16.08.2005 17:53:45


Navigation

Seite News *

Seite Startseite
Seite Über SELFPHP
Seite Werbung
Seite Kontakt
Seite Forum *
Seite Download *
Seite SELFPHP Banner *
Seite SELFPHP in Buchform
Seite Newsletter *
Seite Impressum

 
* Link führt ins Internet


Anbieterverzeichnis
Informieren Sie sich über die Unternehmen in unserem Anbieterverzeichnis!  

 


SELFPHP Forum
Fragen rund um die Themen PHP? In über 79.000 Beiträgen finden Sie sicher die passende Antwort!  


Newsletter
Abonnieren Sie hier den kostenlosen SELFPHP Newsletter!

Vorname: 
Name:
E-Mail:
 



 

Dateiupload via HTML-Formular




Sollten Sie Ihren Kunden die Pflege Ihrer Daten überlassen, ist es in den meisten Fällen erforderlich einen Dateiupload bereitzustellen. Eine sinnvolle, wenn auch nicht immer effektive Alternative zum FTP Zugriff, ist der Upload von Dateien mit Hilfe von Formularen.


Aufbau des Formulars

Damit der Browser eine Datei vom Client zum Server überträgt, benötigen Sie ein <input>-Feld vom Typ file und das Attribut enctype="multipart/form-data" des <form>-Tag. Zusätzlich ist die Übertragungsmethode POST zwingend erforderlich, damit der Dateiupload fehlerfrei durchgeführt werden kann. Es können sowohl Text- als auch Binärdaten hochgeladen werden.

Beispiel - Formular (up_form.html)


<html>
<head>
<title>Dateiupload</title>
</head>
<body>
<p><font face="Arial, Helvetica, sans-serif" size="6">Dateiupload via HTML </font></p>
<form method="post" action="upload.php" enctype="multipart/form-data">
  Datei:
  <input type="hidden" name="MAX_FILE_SIZE" value="100000">
  <input type="file" name="datei" size="40" maxlength="100000">
  <input type="submit" name="Submit" value="Senden">
</form>
</body>
</html>



PHP stellt Ihnen die Möglichkeit zur Verfügung, über ein im Formular definiertes verstecktes-Feld, mit dem Namen MAX_FILE_SIZE, die maximale Dateigrösse festzulegen. Sollte eine grössere Datei übertragen werden, so wird diese verworfen und ein Fehler ausgegeben. Sie sollten sich jedoch grundsätzlich nicht nur auf das versteckte-Feld verlassen, sondern sollten serverseitig überprüfen, was tatsächlich übertragen wurde.


Informationen zur Datei

Bevor wir uns mit dem upload.php Skript befassen, sollten wir Ihnen noch die Überprüfungsmöglichkeiten des Servers vorstellen. Sobald eine Datei an den Server übertragen wird, wird automatisch das globale Array $_FILES erzeugt. In diesem assoziativen Array sind sämtliche Informationen zur Datei gespeichert.


Beispiel - Erfassen der $_FILES Informationen



<html>
<head>
<title>Dateiupload</title>
</head>
<body>
<p><font face="Arial, Helvetica, sans-serif" size="6">Dateiupload via HTML </font></p>
<form method="post" action="<? echo $PHP_SELF ?>" enctype="multipart/form-data">
  Datei:
  <input type="hidden" name="MAX_FILE_SIZE" value="100000">
  <input type="file" name="datei" size="40" maxlength="100000">
  <input type="submit" name="Submit" value="Senden">
</form>
<?php

// Dateiinformationen (Ausgabe über Schleife)
if (isset($_FILES["datei"])) {
    foreach (
$_FILES["datei"] as $key=>$element) {
        echo 
"[$key] => $element<br>";
    }
}
?>
</body>
</html>




Ausgabe



[name] => eingabe.zip
[type] => application/x-zip-compressed
[tmp_name] => C:\WINDOWS\TEMP\php7023.TMP
[error] => 0
[size] => 20764



Hinter diesen Fünf Elementen stecken folgende Details:


Element Syntax Bedeutung
name $_FILES["datei"]["name"] Der ursprüngliche Dateiname auf der Client Maschine. Der genaue Dateiname mit evtl. vorhandenen Laufwerksbuchstaben, Pfadseparatoren und anderen Sonderzeichen ist betriebssystemabhängig.
type $_FILES["datei"]["type"] Dieses Element enthält den MIME-Type der Datei, so wie er dem Server vom Browser übermittelt worden ist. Dieser Wert kann unter Umständen nicht richtig sein, je nach Einstellung des Browsers. Beim Ermitteln des Typs von hochgeladenen Grafiken sollte stattdessen die Funktion getimagesize() verwendet werden.
size $_FILES["datei"]["size"] Die Größe der hochgeladenen Datei in Bytes.
tmp_name $_FILES["datei"]["tmp_name"] Dieses Element enthält den Namen der Datei in einem temporären Verzeichnis auf dem Server. Sie kann von dort mit einem move_uploaded_file()-Aufruf abgeholt werden. Das ist auch notwendig, da die Originaldatei am Ende des Skriptes automatisch gelöscht wird.
error $_FILES["datei"]["error"] Dieses Element wurde mit PHP 4.2.0 eingeführt und enthält den Status des Dateiuploads. Die möglichen Werte und dazugehörige Konstanten finden Sie weiter unten.


Die wohl wichtigsten Informationen stecken in $_FILES["datei"]["size"], $_FILES["datei"]["type"] und $_FILES["datei"]["error"].

Mit Hilfe des Elemnt $_FILES["datei"]["error"] können Sie kontrollieren, ob und welcher Fehler aufgetreten ist.


Fehlerkonstante Wert Bedeutung
UPLOAD_ERR_OK 0 Es liegt kein Fehler vor, die Datei wurde erfolgreich hochgeladen.
UPLOAD_ERR_INI_SIZE 1 Die hochgeladene Datei überschreitet die in der Anweisung upload_max_filesize in php.ini festgelegte Größe.
UPLOAD_ERR_FORM_SIZE 2 Die hochgeladene Datei überschreitet die in dem HTML Formular mittels der Anweisung MAX_FILE_SIZE angegebene maximale Dateigröße.
UPLOAD_ERR_PARTIAL 3 Die Datei wurde nur teilweise hochgeladen.
UPLOAD_ERR_NO_FILE 4 Es wurde keine Datei zum Server übertragen, das Feld war leer.


Auch wenn kein Fehler aufgetreten ist, entbietet Sie dies nicht von der Aufgabe, zu überprüfen, ob die Datei tatsächlich Ihren gewünschten Anforderungen entspricht. Grundsätzlich kann jede Benutzereingabe manipuliert sein, daher sollten Sie vor allem beim Dateiupload möglichst auf Nummer sicher gehen.

Hinweis: Dateien, welche den Fehler UPLOAD_ERR_INI_SIZE oder UPLOAD_ERR_FORM_SIZE erzeugen, werden automatisch vom Server gelöscht.


Achtung: PHP 4-Versionen die kleiner als PHP 4.1 sind kennen das globale Array $_FILES nicht. Statt dessen können Sie auf das assoziative Array $HTTP_POST_FILES zurückgreifen.



Ablegen der Datei auf dem Server

Nun haben Sie es fast schon überstanden. Sobald eine Datei an den Server gesendet wurde, wird diese in einem temporären Verzeichnis unter einem temporäreren Namen gespeichert. Diese Datei wird jedoch automatisch gelöscht, wenn das verarbeitende Skript beendet wurde. Sie müssen daher, diese Datei zum endgültigen Ablageverzeichnis kopieren.

Sie sollten sich nun dem upload.php zuwenden, auf dem im HTML-Formular für den Dateiupload verwiesen wurde.


Beispiel - upload.php



<html>
<head>
<title>Dateiupload - Status</title>
</head>
<body>
<?php

// Prüfen des Array $_FILES
if (isset($_FILES["datei"])) {

// Upload-Status
if ($_FILES["datei"]["error"] == UPLOAD_ERR_OK) {

// Muster zur Überprüfung der im Dateinamen
// enthaltenen Zeichen (Optional)
$regExp "/^[a-z_]([a-z0-9_-]*\.?[a-z0-9_-])*\.[a-z]{3,4}$/i";

// Dateiname und Dateigrösse
if (preg_match($regExp,$_FILES["datei"]["name"]) && $_FILES["datei"]["size"] > && $_FILES["datei"]["size"] < 100000) {

// Temporäre Datei in das Zielverzeichnis
// des Servers verschieben.
move_uploaded_file($_FILES["datei"]["tmp_name"],"shots/".$_FILES["datei"]["name"]);

// Redirect zur Erfolgs-Meldung
header("Location: status.html");
}
else {
echo 
"Fehler: Im Dateinamen oder Dateigrössen Limit!";
}
}
else {
echo 
"Fehler: Während der Übertragung aufgetreten!";
}
}
else {
echo 
"Fehler: Dateiupload fehlgeschlagen!";
}

?>
</body>
</html>




Beispiel - status.html



<html>
<head>
<title>Dateiupload - Erfolgreich</title>
</head>
<body>
<p><font face="Arial, Helvetica, sans-serif" size="6">Upload: Erfolgreich</font></p>
<p><font face="Arial, Helvetica, sans-serif"><a href="up_form.html">[Zum Dateiupload]</a></font></p>
</body>
</html>



Eine sicher Funktion für Kopiervorgänge ist die Funktion move_uploaded_file(). Diese Funktion prüft, ob die angegebene Datei tatsächlich eine Uploaddatei ist und verschiebt diese in das Zielverzeichnis. Dies können Sie der Codezeile aus dem Skript entnehmen:

move_uploaded_file($_FILES["datei"]["tmp_name"],"shots/".$_FILES["datei"]["name"]);

Mit dem erste Argument wird der Dateinamen der temporären Datei festgelegt und mit dem zweiten Argument legt man das Zielverzeichnis samt neuen Dateinamen fest. Im vorliegenden Fall entspricht der neue Dateiname, dem ursprünglichen Dateiname des Client-System.

Achtung: Die Funktion move_uploaded_file() ist lediglich für tatsächlich per Upload übertragene Dateien geeignet. Sollten Sie vorhaben eine Datei des Dateisystems zu verschieben, so müssen Sie auf die Funktion copy() zurückgreifen und anschliessend die Originaldatei entfernen.



Upload mehrerer Dateien

Das Auswählen mehrerer Dateien oder gar ganzer Verzeichnisse ist mit einem <input>-Feld nicht möglich. Auch das Vorgeben eines bestimmten Verzeichnisses oder vollständigen Pfades ist bei <input>-Feldern unterbunden und zwar aus Sicherheitsgründen!

Mehrere Dateien lassen sich beispielsweise, wie folgt übertragen:
. Mit Hilfe von mehreren file <input>-Feldern - pro Datei eines.
Tipp: Um dies zu tun empfehlen wir Ihnen, die gleiche Array-Sende-Syntax wie bei Auswahllisten mit Mehrfachauswahl und Checkboxen zu verwenden. Vergessen Sie nich die eckigen Klammen ([]) an den Namen des file <input>-Feldes anzuhängen, um in PHP ein Array mit den Dateiinformationen zu erhalten.
. In Form von einer .zip- oder .tar-Datei
. per FTP


Beispiel



<form action="upload.php" method="post" enctype="multipart/form-data">
  Dateien:<br>
  <input name="datei[]" type="file"><br>
  <input name="datei[]" type="file"><br>
  <input type="submit" value="Senden">
</form>



Wenn das obige Formular übermittelt ist, werden die Arrays $_FILES["datei"], $_FILES["datei"]["name"] und $_FILES["datei"]["size"] erzeugt.

Der Name der ersten und zweiten Datei findet sich in diesem Beispiel unter:
$_FILES["datei"]["name"][0] // Erste Datei
$_FILES["datei"]["name"][1] // Zweite Datei


Diese Indizierung gilt auch für alle weiteren Dateiinformationen, wie $_FILES["datei"]["tmp_name"][0], $_FILES["datei"]["size"][0], $_FILES["datei"]["type"][0] und $_FILES["datei"]["error"][0].

Hier ein Beispiel - zur Realisierung werden eine HTML-Datei, ein PHP-Skript und ein Verzeichnis benötigt.
. HTML-Datei (Bezeichnung: up_form.html)
. PHP-Skript (Bezeichnung: uploadmult.php)
. Verzeichnis (Bezeichnung: shots)


HTML-Datei (up_form.html)



<html> 
<head> 
<title>Dateiupload</title> 
</head> 
<body> 
<p><font face="Arial, Helvetica, sans-serif" size="6">Dateiupload via HTML </font></p> 
<form action="uploadmult.php" method="post" enctype="multipart/form-data"> 
   Dateien:<br> 
   <input type="hidden" name="MAX_FILE_SIZE" value="100000"> 
   <input name="datei[]" type="file" maxlength="100000"><br> 
   <input name="datei[]" type="file" maxlength="100000"><br> 
   <input name="datei[]" type="file" maxlength="100000"><br> 
   <input type="submit" value="Senden"> 
</form> 
</body> 
</html>




PHP-Skript (uploadmult.php)



<? 

// Prüfen des Array $_FILES 
if (isset($_FILES["datei"])) 

   foreach (
$_FILES["datei"] as $ids=>$dateieninfos
   {       
      if (
$ids == "name"
      {                   
         foreach (
$dateieninfos as $id=>$info
         {             
            
// Upload-Status          
            
if ($_FILES["datei"]["error"][$id] == UPLOAD_ERR_OK
            {                   
               
// Muster zur Überprüfung der im Dateinamen 
               // enthaltenen Zeichen (Optional) 
               
$regExp "/^[a-z_]([a-z0-9_-]*\.?[a-z0-9_-])*\.[a-z]{3,4}$/i"
                
               
// Dateiname und Dateigrösse 
               
if (preg_match($regExp,$_FILES["datei"]["name"][$id]) && $_FILES["datei"]["size"][$id] > && $_FILES["datei"]["size"][$id] < 100000
               {             
                  
// Temporäre Datei in das Zielverzeichnis 
                  // des Servers verschieben. 
                  
move_uploaded_file($_FILES["datei"]["tmp_name"][$id],"shots/".$_FILES["datei"]["name"][$id]); 
                   
                  
// Erfolgs-Meldung                   
                  
echo "<b>Datei " $_FILES["datei"]["name"][$id] . "</b> - Erfolgreich angelegt!<br>\n"
               } 
               else 
               { 
                  echo  
"<b>Fehler bei " $_FILES["datei"]["name"][$id] . "</b> - Im Dateinamen oder Dateigrössen Limit!<br>\n";                   
               } 
            } 
            else 
            {                
               echo  
"<b>Fehler bei " $_FILES["datei"]["name"][$id] . "</b> - Während der Übertragung aufgetreten!<br>\n";                
            } 
         }          
      }          
   } 

else 

echo 
"<b>Fehler</b> - Dateiupload fehlgeschlagen!"


?> 
<a href="up_form.html">Weitere Dateienuploaden</a>




 


Nützliche Verzeichnisoperationen
 




 sponsored by

Host Europe


HighText iBusiness


Host Europe




© 2001-2006 E-Mail SELFPHP - Damir Enseleit, info@selfphp.deImpressumKontakt
© 2005-2006 E-Mail PHP5 Praxisbuch - Matthias Kannengiesser, m.kannengiesser@selfphp.de