<?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 => 'fr',
  ),
  'this' => 
  array (
    0 => 'features.file-upload.post-method.php',
    1 => 'Chargements de fichiers par m&eacute;thode POST',
    2 => 'Chargements de fichiers par m&eacute;thode POST',
  ),
  'up' => 
  array (
    0 => 'features.file-upload.php',
    1 => 'Gestion des chargements de fichiers',
  ),
  'prev' => 
  array (
    0 => 'features.file-upload.php',
    1 => 'Gestion des chargements de fichiers',
  ),
  'next' => 
  array (
    0 => 'features.file-upload.errors.php',
    1 => 'Explication sur les messages d\'erreurs de chargement de fichiers',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'fr',
    '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">Chargements de fichiers par méthode POST </h2>
  
  <p class="simpara">
   Cette fonctionnalité permet aux personnes de télécharger à la fois du texte
   et des fichiers binaires. Avec les fonctions d&#039;identification et de
   manipulation de fichiers de PHP, il est possible de définir
   qui a le droit de télécharger, mais aussi ce qui sera fait du fichier une
   fois qu&#039;il sera téléchargé.
  </p>
  <p class="simpara">
   PHP est capable de recevoir des fichiers émis par
   un navigateur conforme à la norme RFC-1867.
  </p>
  
  <blockquote class="note"><p><strong class="note">Note</strong>: 
   <strong>Notes de configuration</strong><br />
   <p class="para">
    Voir aussi les directives
    <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> et
    <a href="info.configuration.php#ini.max-input-time" class="link">max_input_time</a> dans <var class="filename">php.ini</var>
   </p>
  </p></blockquote>
  
  <p class="para">
   PHP supporte aussi le chargement par la méthode PUT comme dans le
   navigateur <span class="productname">Netscape Composer</span>
   et <span class="productname">Amaya</span> du W3C. Se reporter au chapitre sur le
   <a href="features.file-upload.put-method.php" class="link">support de la
    méthode PUT</a>.
  </p>
  
  <p class="para">
   <div class="example" id="example-1">
    <p><strong>Exemple #1 Formulaire de chargement de fichier</strong></p>
    <div class="example-contents"><p>
     Un formulaire de téléchargement de fichiers peut être construit
     en créant un formulaire spécifique comme ceci :
    </p></div>
    <div class="example-contents">
<div class="htmlcode"><pre class="htmlcode">&lt;!-- Le type d&#039;encodage des données, enctype, DOIT être spécifié comme ce qui suit --&gt;
&lt;form enctype=&quot;multipart/form-data&quot; action=&quot;__URL__&quot; method=&quot;POST&quot;&gt;
  &lt;!-- MAX_FILE_SIZE doit précéder le champ input de type file --&gt;
  &lt;input type=&quot;hidden&quot; name=&quot;MAX_FILE_SIZE&quot; value=&quot;30000&quot; /&gt;
  &lt;!-- Le nom de l&#039;élément input détermine le nom dans le tableau $_FILES --&gt;
  Envoyez ce fichier : &lt;input name=&quot;userfile&quot; type=&quot;file&quot; /&gt;
  &lt;input type=&quot;submit&quot; value=&quot;Envoyer le fichier&quot; /&gt;
&lt;/form&gt;</pre>
</div>
    </div>

    <div class="example-contents"><p>
     <code class="literal">__URL__</code> dans l&#039;exemple précédent doit être remplacé et
     pointé vers un fichier PHP.
    </p></div>
    <div class="example-contents"><p>
     Le champ caché <code class="literal">MAX_FILE_SIZE</code> (mesuré en octets) doit
     précéder le champ input de type file et sa valeur représente la taille
     maximale acceptée du fichier par PHP.
     Cet élément de formulaire doit toujours être utilisé, car il permet
     d&#039;informer l&#039;utilisateur que le transfert désiré est trop lourd
     avant d&#039;atteindre la fin du téléchargement. Gardez à l&#039;esprit que
     ce paramètre peut être &quot;trompé&quot; du côté du navigateur facilement, aussi
     ne faites pas confiance à ce dernier, ne s&#039;agissant finalement que d&#039;une
     fonctionnalité de convenance côté client. Le paramètre PHP (côté serveur)
     à propos de la taille maximale d&#039;un fichier téléchargé,
     ne peut, lui, être trompé.
    </p></div>
   </div>
  </p>
  
  <blockquote class="note"><p><strong class="note">Note</strong>: 
   <p class="para">
    Il faut s&#039;assurer que le formulaire de téléchargement de fichier contienne
    <code class="literal">enctype=&quot;multipart/form-data&quot;</code>, sinon,
    le fichier ne sera pas téléchargé.
   </p>
  </p></blockquote>
  
  <p class="para">
   La variable globale <var class="varname"><a href="reserved.variables.files.php" class="classname">$_FILES</a></var> va contenir toutes les
   informations sur le fichier téléchargé. Son contenu est détaillé
   dans notre exemple ci-dessous. Il est à noter que l&#039;on suppose que le nom
   de la variable du fichier téléchargé est <em>userfile</em>, tel que
    défini dans le formulaire ci-dessus, mais peut être n&#039;importe quel nom.
    <dl>
     
      <dt><var class="varname"><a href="reserved.variables.files.php" class="classname">$_FILES['userfile']['name']</a></var></dt>
      <dd>
       <p class="para">
        Le nom original du fichier, tel que sur la machine du client web.
       </p>
      </dd>
     
     
      <dt><var class="varname"><a href="reserved.variables.files.php" class="classname">$_FILES['userfile']['type']</a></var></dt>
      <dd>
       <p class="para">
        Le type MIME du fichier, si le navigateur a fourni cette information.
        Par exemple, cela pourra être <code class="literal">&quot;image/gif&quot;</code>.
        Ce type mime n&#039;est cependant pas vérifié du côté de PHP et, donc,
        ne prend pas sa valeur pour se synchroniser.
       </p>
      </dd>
     
     
      <dt><var class="varname"><a href="reserved.variables.files.php" class="classname">$_FILES['userfile']['size']</a></var></dt>
      <dd>
       <p class="para">
        La taille, en octets, du fichier téléchargé.
       </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">
        Le nom temporaire du fichier qui sera chargé sur la machine serveur.
       </p>
      </dd>
     
     
      <dt><var class="varname"><a href="reserved.variables.files.php" class="classname">$_FILES['userfile']['error']</a></var></dt>
      <dd>
       <p class="para">
        Le <a href="features.file-upload.errors.php" class="link">code d&#039;erreur</a>
        associé au téléchargement de fichier.
       </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">
        Le chemin entier tel que soumis par le navigateur.
        Cette valeur ne contient pas toujours une vraie hiérarchie de dossier,
        et il ne faut pas lui faire confiance.
        Disponible à partir de PHP 8.1.0.
       </p>
      </dd>
     
    </dl>
  </p>
  <p class="para">
   Le fichier téléchargé sera stocké temporairement dans le dossier
   temporaire du système, à moins qu&#039;un autre dossier soit fourni avec
   la directive <a href="ini.core.php#ini.upload-tmp-dir" class="link">upload_tmp_dir</a> du
   <var class="filename">php.ini</var>. Le dossier par défaut du serveur peut être changé
   dans l&#039;environnement via la variable <var class="envar">TMPDIR</var>.
   Modifier la valeur de cette variable avec la fonction <span class="function"><a href="function.putenv.php" class="function">putenv()</a></span>
   dans un script PHP sera sans effet. Cette variable d&#039;environnement
   peut aussi être utilisée pour s&#039;assurer que d&#039;autres opérations
   fonctionnent aussi sur les fichiers téléchargés.
   <div class="example" id="example-2">
    <p><strong>Exemple #2 Validation de téléchargement de fichiers</strong></p>
    <div class="example-contents"><p>
     Voir aussi les fonctions <span class="function"><a href="function.is-uploaded-file.php" class="function">is_uploaded_file()</a></span> et
     <span class="function"><a href="function.move-uploaded-file.php" class="function">move_uploaded_file()</a></span> pour plus d&#039;informations.
     L&#039;exemple suivant va télécharger un fichier venant d&#039;un formulaire.
    </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">"Le fichier est valide, et a été téléchargé<br />           avec succès. Voici plus d'informations :\n"</span><span style="color: #007700">;<br />} else {<br />    echo </span><span style="color: #DD0000">"Attaque potentielle par téléchargement de fichiers.<br />          Voici plus d'informations :\n"</span><span style="color: #007700">;<br />}<br /><br />echo </span><span style="color: #DD0000">'Voici quelques informations de débogage :'</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 />echo </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">
   Le script PHP qui reçoit le fichier chargé doit pouvoir
   gérer le fichier de manière appropriée. Il est possible
   d&#039;utiliser la variable <var class="varname"><a href="reserved.variables.files.php" class="classname">$_FILES['userfile']['size']</a></var> pour recaler
   tous les fichiers qui sont trop gros ou trop petits. Il est possible d&#039;utiliser
   la variable <var class="varname"><a href="reserved.variables.files.php" class="classname">$_FILES['userfile']['type']</a></var> pour écarter
   les fichiers qui n&#039;ont pas le bon type, mais l&#039;utiliser uniquement pour une série de
   vérifications, car cette valeur est complètement sous le contrôle du client
   et n&#039;est pas vérifiée du côté de PHP.
   Il est possible d&#039;utiliser l&#039;information dans
   <var class="varname"><a href="reserved.variables.files.php" class="classname">$_FILES['userfile']['error']</a></var> et adapter la politique
   en fonction des <a href="features.file-upload.errors.php" class="link">codes d&#039;erreur</a>.
   Quelle que soit la politique choisie, il est recommandé de soit effacer le fichier du
   dossier temporaire, soit le déplacer.
  </p>
  <p class="simpara">
   Si aucun fichier n&#039;est sélectionné dans le formulaire, PHP retournera
   <code class="literal">0</code> dans <var class="varname"><a href="reserved.variables.files.php" class="classname">$_FILES['userfile']['size']</a></var>
   et rien du tout dans <var class="varname"><a href="reserved.variables.files.php" class="classname">$_FILES['userfile']['tmp_name']</a></var>.
  </p>
  <p class="simpara">
   Le fichier sera automatiquement effacé du dossier temporaire
   à la fin du script, s&#039;il n&#039;a pas été déplacé ou renommé.
  </p>
  <div class="example" id="example-3">
   <p><strong>Exemple #3 Envoi d&#039;un tableau de fichiers</strong></p>
   <div class="example-contents"><p>
    PHP supporte les <a href="faq.html.php#faq.html.arrays" class="link">tableaux en HTML</a>
    ainsi qu&#039;avec les fichiers.
   </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;Images:
&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() peut empêcher les attaques "filesystem traversal";<br />        // une autre validation/nettoyage du nom de fichier peut être appropriée<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">
   La barre de progression de téléchargement peut être implémentée en utilisant <a href="session.upload-progress.php" class="link">la progression du chargement via les sessions</a>.
  </p>
 </div><?php manual_footer($setup); ?>