<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/features.file-upload.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'de',
  ),
  'this' => 
  array (
    0 => 'features.file-upload.post-method.php',
    1 => 'Dateiuploads mit POST',
    2 => 'Dateiuploads mit POST',
  ),
  'up' => 
  array (
    0 => 'features.file-upload.php',
    1 => 'Steuerung von Dateiuploads',
  ),
  'prev' => 
  array (
    0 => 'features.file-upload.php',
    1 => 'Steuerung von Dateiuploads',
  ),
  'next' => 
  array (
    0 => 'features.file-upload.errors.php',
    1 => 'Fehlermeldungen erkl&auml;rt',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'de',
    'path' => 'features/file-upload.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="features.file-upload.post-method" class="sect1">
   <h2 class="title">Dateiuploads mit POST</h2>
   <p class="simpara">
    Dieses Feature erlaubt es Benutzern sowohl Text- als auch Binärdaten
    hochzuladen. Mit PHP&#039;s Authentifizierungs- und Dateifunktionen besteht
    volle Kontrolle darüber, wer Dateien hochladen darf und was mit den
    Dateien geschehen soll, wenn das Hochladen beendet ist.
   </p>
   <p class="simpara">
    PHP kann Dateiuploads von jedem RFC-1867-konformen Browser empfangen.
   </p>
   <blockquote class="note"><p><strong class="note">Hinweis</strong>: 
    <strong>Diesbezügliche Konfigurationshinweise</strong><br />
    <p class="para">
     Siehe auch die Anweisungen
     <a href="ini.core.php#ini.file-uploads" class="link">file_uploads</a>,
     <a href="ini.core.php#ini.upload-max-filesize" class="link">upload_max_filesize</a>,
     <a href="ini.core.php#ini.upload-tmp-dir" class="link">upload_tmp_dir</a>,
     <a href="ini.core.php#ini.post-max-size" class="link">post_max_size</a> und
     <a href="info.configuration.php#ini.max-input-time" class="link">max_input_time</a>
     in der <var class="filename">php.ini</var>
    </p>
   </p></blockquote>
   <p class="para">
    PHP unterstützt auch das Hochladen von Dateien nach der PUT-Methode, die
    beispielsweise vom <span class="productname">Netscape Composer</span> und den
    W3C-<span class="productname">Amaya</span>-Clients verwendet wird. Siehe dazu
    <a href="features.file-upload.put-method.php" class="link">PUT-Unterstützung</a>
    für nähere Informationen.
   </p>
   <p class="para">
    <div class="example" id="example-1">
     <p><strong>Beispiel #1 Formular zum Hochladen von Dateien</strong></p>
     <div class="example-contents"><p>
      Um Dateieuploads zu ermöglichen muss ein Formular erstellt werden,
      welches ungefähr wie folgt aussieht:
     </p></div>
     <div class="example-contents">
<div class="htmlcode"><pre class="htmlcode">&lt;!-- Der Kodierungstyp enctype MUSS wie dargestellt angegeben werden --&gt;
&lt;form enctype=&quot;multipart/form-data&quot; action=&quot;__URL__&quot; method=&quot;POST&quot;&gt;
    &lt;!-- MAX_FILE_SIZE muss vor dem Datei-Eingabefeld stehen --&gt;
    &lt;input type=&quot;hidden&quot; name=&quot;MAX_FILE_SIZE&quot; value=&quot;30000&quot; /&gt;
    &lt;!-- Der Name des Eingabefelds bestimmt den Namen im $_FILES-Array --&gt;
    Diese Datei hochladen: &lt;input name=&quot;userfile&quot; type=&quot;file&quot; /&gt;
    &lt;input type=&quot;submit&quot; value=&quot;Send File&quot; /&gt;
&lt;/form&gt;</pre>
</div>
     </div>

     <div class="example-contents"><p>
      <code class="literal">__URL__</code> im obigen Beispiel sollte durch die URL eines
      PHP-Skripts ersetzt werden.
     </p></div>
     <div class="example-contents"><p>
      Das &quot;hidden&quot;-Feld <code class="literal">MAX_FILE_SIZE</code> muss dem
      &quot;file&quot;-Eingabefeld vorangestellt werden; der angegebene Wert bestimmt
      die maximale akzeptierte Dateigröße in Bytes. Dieses Formular-Element
      sollte immer benutzt werden, da es dem Benutzer erspart auf einen großen
      Dateiupload zu warten, nur um festzustellen, dass die Datei zu groß war
      und der Upload fehlgeschlagen ist. Es sollte jedoch beachtet werden,
      dass diese Browserseitige Einstellung sehr einfach zu umgehen ist und
      man sich daher niemals darauf verlassen sollte, dass sie übergroße
      Dateiuploads verhindert. Die Server-seitige Option für die Maximalgröße
      kann hingegen nicht umgangen werden.
     </p></div>
    </div>
   </p>
   <blockquote class="note"><p><strong class="note">Hinweis</strong>: 
    <p class="para">
     Das Uploadformular muss unbedingt das Attribut
     <code class="literal">enctype=&quot;multipart/form-data&quot;</code> angeben, andernfalls
     wird der Upload nicht funktionieren.
    </p>
   </p></blockquote>
   <p class="para">
    Die globale Variable <var class="varname"><a href="reserved.variables.files.php" class="classname">$_FILES</a></var> enthält alle Informationen
    über hochgeladene Dateien. Im Folgenden sind ihre Inhalte für das obige
    Beispielformular aufgelistet. Beachten Sie, dass dies auf der Annahme
    basiert, dass der Name des Dateiuploads wie in dem obigen Beispielskript
    <em>userfile</em> ist. Es kann aber auch jeder andere Name
    verwendet werden.
    <dl>
     
      <dt><var class="varname"><a href="reserved.variables.files.php" class="classname">$_FILES['userfile']['name']</a></var></dt>
      <dd>
       <p class="para">
        Der ursprüngliche Dateiname auf dem Computer des Benutzers.
       </p>
      </dd>
     
     
      <dt><var class="varname"><a href="reserved.variables.files.php" class="classname">$_FILES['userfile']['type']</a></var></dt>
      <dd>
       <p class="para">
        Der MIME-Type der Datei, falls der Browser diese Information zur
        Verfügung gestellt hat. Ein Beispiel wäre
        <code class="literal">&quot;image/gif&quot;</code>. Dieser MIME-Type wird jedoch nicht von
        PHP geprüft und kann somit falsch sein.
       </p>
      </dd>
     
     
      <dt><var class="varname"><a href="reserved.variables.files.php" class="classname">$_FILES['userfile']['size']</a></var></dt>
      <dd>
       <p class="para">
        Die Größe der hochgeladenen Datei in Bytes.
       </p>
      </dd>
     
     
      <dt><var class="varname"><a href="reserved.variables.files.php" class="classname">$_FILES['userfile']['tmp_name']</a></var></dt>
      <dd>
       <p class="para">
        Der temporäre Dateiname, unter dem die hochgeladene Datei auf dem
        Server gespeichert wurde.
       </p>
      </dd>
     
     
      <dt><var class="varname"><a href="reserved.variables.files.php" class="classname">$_FILES['userfile']['error']</a></var></dt>
      <dd>
       <p class="para">
        Der <a href="features.file-upload.errors.php" class="link">Fehlercode</a> des
        Uploads.
       </p>
      </dd>
     
     
      <dt><var class="varname"><a href="reserved.variables.files.php" class="classname">$_FILES['userfile']['full_path']</a></var></dt>
      <dd>
       <p class="para">
        Der vollständige Pfad, wie er vom Browser übermittelt wurde. Dieser
        Wert enthält nicht immer eine echte Verzeichnisstruktur und ist daher
        nicht vertrauenswürdig.
        Verfügbar ab PHP 8.1.0.
       </p>
      </dd>
     
    </dl>
   </p>
   <p class="para">
    Standardmäßig werden Dateien im standardmäßigen temporären Verzeichnis des
    Servers gespeichert, außer es wurde mittels <a href="ini.core.php#ini.upload-tmp-dir" class="link">upload_tmp_dir</a> in der <var class="filename">php.ini</var> ein
    anderer Ort konfiguriert. Das Standardverzeichnis des Servers kann durch
    das Setzen der Umgebungsvariablen <var class="envar">TMPDIR</var> in der Umgebung,
    in der PHP ausgeführt wird, geändert werden. Das Setzen mittels der
    Funktion <span class="function"><a href="function.putenv.php" class="function">putenv()</a></span> innerhalb eines Skriptes ist nicht
    möglich. Mittels dieser Umgebungsvariable kann auch sichergestellt werden,
    dass auch andere Operationen an hochgeladenen Dateien arbeiten können.
    <div class="example" id="example-2">
     <p><strong>Beispiel #2 Dateiuploads prüfen</strong></p>
     <div class="example-contents"><p>
      Weitere Informationen finden Sie auch in den Beschreibungen für
      <span class="function"><a href="function.is-uploaded-file.php" class="function">is_uploaded_file()</a></span> und
      <span class="function"><a href="function.move-uploaded-file.php" class="function">move_uploaded_file()</a></span>. Das folgende Beispiel
      verarbeitet einen von einem HTML-Formular kommenden Dateiupload.
     </p></div>
     <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$uploaddir </span><span style="color: #007700">= </span><span style="color: #DD0000">'/var/www/uploads/'</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$uploadfile </span><span style="color: #007700">= </span><span style="color: #0000BB">$uploaddir </span><span style="color: #007700">. </span><span style="color: #0000BB">basename</span><span style="color: #007700">(</span><span style="color: #0000BB">$_FILES</span><span style="color: #007700">[</span><span style="color: #DD0000">'userfile'</span><span style="color: #007700">][</span><span style="color: #DD0000">'name'</span><span style="color: #007700">]);<br /><br />echo </span><span style="color: #DD0000">'&lt;pre&gt;'</span><span style="color: #007700">;<br />if (</span><span style="color: #0000BB">move_uploaded_file</span><span style="color: #007700">(</span><span style="color: #0000BB">$_FILES</span><span style="color: #007700">[</span><span style="color: #DD0000">'userfile'</span><span style="color: #007700">][</span><span style="color: #DD0000">'tmp_name'</span><span style="color: #007700">], </span><span style="color: #0000BB">$uploadfile</span><span style="color: #007700">)) {<br />    echo </span><span style="color: #DD0000">"Datei ist valide und wurde erfolgreich hochgeladen.\n"</span><span style="color: #007700">;<br />} else {<br />    echo </span><span style="color: #DD0000">"Möglicherweise eine Dateiupload-Attacke!\n"</span><span style="color: #007700">;<br />}<br /><br />echo </span><span style="color: #DD0000">'Weitere Debugging Informationen:'</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">print_r</span><span style="color: #007700">(</span><span style="color: #0000BB">$_FILES</span><span style="color: #007700">);<br /><br />print </span><span style="color: #DD0000">"&lt;/pre&gt;"</span><span style="color: #007700">;<br /><br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
     </div>

    </div>
   </p>
   <p class="simpara">
    Das die hochgeladene Datei empfangende Skript sollte die notwendige Logik
    zur Entscheidung enthalten, was mit der hochgeladenen Datei geschehen
    soll. Sie können zum Beispiel
    <var class="varname"><a href="reserved.variables.files.php" class="classname">$_FILES['userfile']['size']</a></var> verwenden, um zu kleine
    bzw. zu große Dateien wegzuwerfen. Sie können
    <var class="varname"><a href="reserved.variables.files.php" class="classname">$_FILES['userfile']['type']</a></var> nutzen, um Dateien eines
    unerwünschten Typs wegzuwerfen, sollten dabei jedoch beachten, dass dieser
    Wert vollständig vom Benutzer kontrolliert wird und somit falsch sein
    kann. Sie können Ihre Logik auch mittels
    <var class="varname"><a href="reserved.variables.files.php" class="classname">$_FILES['userfile']['error']</a></var> anhand der
    <a href="features.file-upload.errors.php" class="link">Fehlercodes</a> planen.
    Egal welche Logik Sie verwenden, Sie sollten die Datei im temporären
    Verzeichnis entweder löschen, oder an einen anderen Ort verschieben.
   </p>
   <p class="simpara">
    Wenn im Formular keine Datei ausgewählt wurde so wird
    <var class="varname"><a href="reserved.variables.files.php" class="classname">$_FILES['userfile']['size']</a></var> von PHP auf 0 gesetzt und
    <var class="varname"><a href="reserved.variables.files.php" class="classname">$_FILES['userfile']['tmp_name']</a></var> ist leer.
   </p>
   <p class="simpara">
    Wurde die Datei in dem temporären Verzeichnis nicht verschoben oder
    umbenannt, wird sie am Ende des Requests gelöscht.
   </p>
   <div class="example" id="example-3">
    <p><strong>Beispiel #3 Hochladen eines Arrays von Dateien</strong></p>
     <div class="example-contents"><p>
      PHP unterstützt <a href="faq.html.php#faq.html.arrays" class="link">HTML Arrays</a>
      auch für Dateien.
     </p></div>
     <div class="example-contents">
<div class="htmlcode"><pre class="htmlcode">&lt;form action=&quot;&quot; method=&quot;post&quot; enctype=&quot;multipart/form-data&quot;&gt;
&lt;p&gt;Pictures:
&lt;input type=&quot;file&quot; name=&quot;pictures[]&quot; /&gt;
&lt;input type=&quot;file&quot; name=&quot;pictures[]&quot; /&gt;
&lt;input type=&quot;file&quot; name=&quot;pictures[]&quot; /&gt;
&lt;input type=&quot;submit&quot; value=&quot;Send&quot; /&gt;
&lt;/p&gt;
&lt;/form&gt;</pre>
</div>
     </div>

     <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">foreach (</span><span style="color: #0000BB">$_FILES</span><span style="color: #007700">[</span><span style="color: #DD0000">"pictures"</span><span style="color: #007700">][</span><span style="color: #DD0000">"error"</span><span style="color: #007700">] as </span><span style="color: #0000BB">$key </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">$error</span><span style="color: #007700">) {<br />    if (</span><span style="color: #0000BB">$error </span><span style="color: #007700">== </span><span style="color: #0000BB">UPLOAD_ERR_OK</span><span style="color: #007700">) {<br />        </span><span style="color: #0000BB">$tmp_name </span><span style="color: #007700">= </span><span style="color: #0000BB">$_FILES</span><span style="color: #007700">[</span><span style="color: #DD0000">"pictures"</span><span style="color: #007700">][</span><span style="color: #DD0000">"tmp_name"</span><span style="color: #007700">][</span><span style="color: #0000BB">$key</span><span style="color: #007700">];<br />        </span><span style="color: #FF8000">// basename() kann Directory Traversal Angriffe verhindern; weitere<br />        // Gültigkeitsprüfung/Bereinigung des Dateinamens kann angebracht sein<br />        </span><span style="color: #0000BB">$name </span><span style="color: #007700">= </span><span style="color: #0000BB">basename</span><span style="color: #007700">(</span><span style="color: #0000BB">$_FILES</span><span style="color: #007700">[</span><span style="color: #DD0000">"pictures"</span><span style="color: #007700">][</span><span style="color: #DD0000">"name"</span><span style="color: #007700">][</span><span style="color: #0000BB">$key</span><span style="color: #007700">]);<br />        </span><span style="color: #0000BB">move_uploaded_file</span><span style="color: #007700">(</span><span style="color: #0000BB">$tmp_name</span><span style="color: #007700">, </span><span style="color: #DD0000">"data/</span><span style="color: #0000BB">$name</span><span style="color: #DD0000">"</span><span style="color: #007700">);<br />    }<br />}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
     </div>

    </div>
   <p class="para">
    Eine Fortschrittsanzeige für Dateiuploads kann mittels
    <a href="session.upload-progress.php" class="link">Session Upload Progress</a>
    implementiert werden.
   </p>
  </div><?php manual_footer($setup); ?>