<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/book.session.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'fr',
  ),
  'this' => 
  array (
    0 => 'session.upload-progress.php',
    1 => 'Progression d\'un t&eacute;l&eacute;versement (upload) en session',
    2 => 'Progression d\'un t&eacute;l&eacute;versement (upload) en session',
  ),
  'up' => 
  array (
    0 => 'book.session.php',
    1 => 'Sessions',
  ),
  'prev' => 
  array (
    0 => 'session.customhandler.php',
    1 => 'Gestion personnalis&eacute;e des sessions',
  ),
  'next' => 
  array (
    0 => 'session.security.php',
    1 => 'Sessions et S&eacute;curit&eacute;',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'fr',
    'path' => 'reference/session/upload-progress.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="session.upload-progress" class="chapter">
 <h1 class="title">Progression d&#039;un téléversement (upload) en session</h1>


 <p class="simpara">
  Lorsque l&#039;option de configuration
  <a href="session.configuration.php#ini.session.upload-progress.enabled" class="link">session.upload_progress.enabled</a>
  est active, PHP sera capable de traquer la progression d&#039;un fichier en
  cours de téléversement (upload). Cette information n&#039;est pas particulièrement utile
  pour la requête de téléversement en tant que tel, mais pendant le téléversement,
  une application peut envoyer une requête POST séparée (via 
  <abbr>XHR</abbr> par exemple) pour vérifier le statut de ce téléversement.
 </p>
 <p class="para">
  La progression du téléversement sera disponible dans la variable super-globale
  <var class="varname"><a href="reserved.variables.session.php" class="classname">$_SESSION</a></var> lorsque le téléversement est en cours,
  et lors d&#039;un envoi en méthode POST d&#039;une variable du même nom que celui
  défini dans l&#039;option de configuration INI
  <a href="session.configuration.php#ini.session.upload-progress.name" class="link">session.upload_progress.name</a>.
  Lorsque PHP détecte une requête POST de ce type, il remplira un tableau dans
  <var class="varname"><a href="reserved.variables.session.php" class="classname">$_SESSION</a></var>, où l&#039;index est une valeur concaténée des options
  de configuration
  <a href="session.configuration.php#ini.session.upload-progress.prefix" class="link">session.upload_progress.prefix</a>
  et
  <a href="session.configuration.php#ini.session.upload-progress.name" class="link">session.upload_progress.name</a>.
  La clé est typiquement récupérée en lisant ces configurations INI, c.-à-d.
  <div class="informalexample">
   <div class="example-contents">
<div class="phpcode"><pre><code style="color: #000000"><span style="color: #0000BB">&lt;?php
$key </span><span style="color: #007700">= </span><span style="color: #0000BB">ini_get</span><span style="color: #007700">(</span><span style="color: #DD0000">"session.upload_progress.prefix"</span><span style="color: #007700">) . </span><span style="color: #0000BB">$_POST</span><span style="color: #007700">[</span><span style="color: #0000BB">ini_get</span><span style="color: #007700">(</span><span style="color: #DD0000">"session.upload_progress.name"</span><span style="color: #007700">)];
</span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$_SESSION</span><span style="color: #007700">[</span><span style="color: #0000BB">$key</span><span style="color: #007700">]);
</span><span style="color: #0000BB">?&gt;</span></code></pre></div>
   </div>

  </div>
 </p>
 <p class="simpara">
  Il est également possible d&#039;<em>annuler</em> le téléversement courant
  en définissant la clé <code class="literal">$_SESSION[$key][&quot;cancel_upload&quot;]</code> à la valeur
  <strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong>. Lors du téléversement de plusieurs fichiers dans la même
  requête, cette action n&#039;annulera que le fichier actuellement en cours de téléversement,
  ainsi que ceux en attente de téléversement mais n&#039;annulera pas les téléversements
  terminés avec succès. Lorsqu&#039;un téléversement est annulé en utilisant cette méthode,
  la clé <code class="literal">error</code> du tableau <var class="varname"><a href="reserved.variables.files.php" class="classname">$_FILES</a></var> sera définie à
  <strong><code><a href="filesystem.constants.php#constant.upload-err-extension">UPLOAD_ERR_EXTENSION</a></code></strong>.
 </p>
 <p class="simpara">
  Les options de configuration INI
  <a href="session.configuration.php#ini.session.upload-progress.freq" class="link">session.upload_progress.freq</a>
  et
  <a href="session.configuration.php#ini.session.upload-progress.min-freq" class="link">session.upload_progress.min_freq</a>
  contrôlent la fréquence de mise à jour des informations de progression de téléversement.
  Avec une configuration raisonnable de ces 2 options, le surcoût en terme
  de charge est quasi nul.
 </p>
 <p class="para">
  <div class="example" id="example-1">
   <p><strong>Exemple #1 Exemple</strong></p>
   <div class="example-contents"><p>
    Exemple de structure du tableau contenant les informations de
    téléversement.
   </p></div>
   <div class="example-contents">
<div class="htmlcode"><pre class="htmlcode">&lt;form action=&quot;upload.php&quot; method=&quot;POST&quot; enctype=&quot;multipart/form-data&quot;&gt;
 &lt;input type=&quot;hidden&quot; name=&quot;&lt;?php echo ini_get(&quot;session.upload_progress.name&quot;); ?&gt;&quot; value=&quot;123&quot; /&gt;
 &lt;input type=&quot;file&quot; name=&quot;file1&quot; /&gt;
 &lt;input type=&quot;file&quot; name=&quot;file2&quot; /&gt;
 &lt;input type=&quot;submit&quot; /&gt;
&lt;/form&gt;</pre>
</div>
   </div>

   <div class="example-contents"><p>
    Les données stockées en session ressembleront à :
   </p></div>
   <div class="example-contents">
<div class="phpcode"><pre><code style="color: #000000"><span style="color: #0000BB">&lt;?php
$_SESSION</span><span style="color: #007700">[</span><span style="color: #DD0000">"upload_progress_123"</span><span style="color: #007700">] = array(
 </span><span style="color: #DD0000">"start_time" </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">1234567890</span><span style="color: #007700">,   </span><span style="color: #FF8000">// L'heure de la requête
 </span><span style="color: #DD0000">"content_length" </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">57343257</span><span style="color: #007700">, </span><span style="color: #FF8000">// Longueur du contenu POST
 </span><span style="color: #DD0000">"bytes_processed" </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">453489</span><span style="color: #007700">,  </span><span style="color: #FF8000">// Quantité d'octets reçus et traités
 </span><span style="color: #DD0000">"done" </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">false</span><span style="color: #007700">,              </span><span style="color: #FF8000">// true lorsque le gestionnaire POST a terminé, avec succès ou non
 </span><span style="color: #DD0000">"files" </span><span style="color: #007700">=&gt; array(
  </span><span style="color: #0000BB">0 </span><span style="color: #007700">=&gt; array(
   </span><span style="color: #DD0000">"field_name" </span><span style="color: #007700">=&gt; </span><span style="color: #DD0000">"file1"</span><span style="color: #007700">,       </span><span style="color: #FF8000">// Nom du champ &lt;input/&gt;
   // Les 3 éléments suivants sont équivalents à ceux dans $_FILES
   </span><span style="color: #DD0000">"name" </span><span style="color: #007700">=&gt; </span><span style="color: #DD0000">"foo.avi"</span><span style="color: #007700">,
   </span><span style="color: #DD0000">"tmp_name" </span><span style="color: #007700">=&gt; </span><span style="color: #DD0000">"/tmp/phpxxxxxx"</span><span style="color: #007700">,
   </span><span style="color: #DD0000">"error" </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">0</span><span style="color: #007700">,
   </span><span style="color: #DD0000">"done" </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">true</span><span style="color: #007700">,                </span><span style="color: #FF8000">// True lorsque le gestionnaire POST a terminé de gérer ce fichier
   </span><span style="color: #DD0000">"start_time" </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">1234567890</span><span style="color: #007700">,    </span><span style="color: #FF8000">// L'heure de début de requête
   </span><span style="color: #DD0000">"bytes_processed" </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">57343250</span><span style="color: #007700">, </span><span style="color: #FF8000">// Quantité d'octets reçus et traités pour ce fichier
  </span><span style="color: #007700">),
  </span><span style="color: #FF8000">// Un autre fichier, en cours de téléversement, dans la même requête
  </span><span style="color: #0000BB">1 </span><span style="color: #007700">=&gt; array(
   </span><span style="color: #DD0000">"field_name" </span><span style="color: #007700">=&gt; </span><span style="color: #DD0000">"file2"</span><span style="color: #007700">,
   </span><span style="color: #DD0000">"name" </span><span style="color: #007700">=&gt; </span><span style="color: #DD0000">"bar.avi"</span><span style="color: #007700">,
   </span><span style="color: #DD0000">"tmp_name" </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">NULL</span><span style="color: #007700">,
   </span><span style="color: #DD0000">"error" </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">0</span><span style="color: #007700">,
   </span><span style="color: #DD0000">"done" </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">false</span><span style="color: #007700">,
   </span><span style="color: #DD0000">"start_time" </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">1234567899</span><span style="color: #007700">,
   </span><span style="color: #DD0000">"bytes_processed" </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">54554</span><span style="color: #007700">,
  ),
 )
);</span></code></pre></div>
   </div>

  </div>
 </p>
 <div class="warning"><strong class="warning">Avertissement</strong>
  <p class="simpara">
   La mise en mémoire tampon de la requête du serveur web doit être désactivée
   pour la bonne marche de cette fonctionnalité, sinon PHP ne verra le fichier
   qu&#039;une fois qu&#039;il sera totalement téléversé. Les serveurs tels que Nginx
   sont connus pour mettre en mémoire tampon des grosses requêtes.
  </p>
 </div>
 <div class="caution"><strong class="caution">Attention</strong>
  <p class="simpara">
   Les informations de la progression du téléversement sont écrites en session avant
   qu&#039;un script soit exécuté. Par conséquent, changer le nom de session grâce à
   <span class="function"><a href="function.ini-set.php" class="function">ini_set()</a></span> ou <span class="function"><a href="function.session-name.php" class="function">session_name()</a></span> donnera une
   session sans les informations de progression du téléversement.
   Cela signifie également que les gestionnaires de session utilisateur ne sont
   jamais utilisés pour les informations de progression du téléversement,
   puisqu&#039;aucun code n&#039;a pu définir le gestionnaire de session comme
   gestionnaire utilisateur en appelant
   <span class="function"><a href="function.session-set-save-handler.php" class="function">session_set_save_handler()</a></span>.
  </p>
 </div>

</div>
<?php manual_footer($setup); ?>