<?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 => 'es',
  ),
  'this' => 
  array (
    0 => 'session.upload-progress.php',
    1 => 'Progresi&oacute;n de una subida (upload) en sesi&oacute;n',
    2 => 'Progresi&oacute;n de una subida (upload) en sesi&oacute;n',
  ),
  'up' => 
  array (
    0 => 'book.session.php',
    1 => 'Sesiones',
  ),
  'prev' => 
  array (
    0 => 'session.customhandler.php',
    1 => 'Gesti&oacute;n personalizada de sesiones',
  ),
  'next' => 
  array (
    0 => 'session.security.php',
    1 => 'Sesiones y Seguridad',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'es',
    '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">Progresión de una subida (upload) en sesión</h1>


 <p class="para">
  Cuando la opción de configuración
  <a href="session.configuration.php#ini.session.upload-progress.enabled" class="link">session.upload_progress.enabled</a>
  está activa, PHP será capaz de rastrear la progresión de un fichero en
  curso de subida (upload). Esta información no es particularmente útil
  para la petición de subida en sí, pero durante la subida,
  una aplicación puede enviar una petición POST separada (por ejemplo,
  mediante <abbr>XHR</abbr>) para verificar el estado de esta subida.
 </p>
 <p class="para">
  La progresión de la subida estará disponible en la variable superglobal
  <var class="varname"><a href="reserved.variables.session.php" class="classname">$_SESSION</a></var> cuando la subida está en curso,
  y durante un envío en método POST de una variable con el mismo nombre que el
  definido en la opción de configuración INI
  <a href="session.configuration.php#ini.session.upload-progress.name" class="link">session.upload_progress.name</a>.
  Cuando PHP detecta una petición POST de este tipo, llenará un array en
  <var class="varname"><a href="reserved.variables.session.php" class="classname">$_SESSION</a></var>, donde el índice es un valor concatenado de las opciones
  de configuración
  <a href="session.configuration.php#ini.session.upload-progress.prefix" class="link">session.upload_progress.prefix</a>
  y
  <a href="session.configuration.php#ini.session.upload-progress.name" class="link">session.upload_progress.name</a>.
  La clave se recupera típicamente leyendo estas configuraciones INI, es decir:
  <div class="informalexample">
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$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">)];<br /></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">]);<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

  </div>
 </p>
 <p class="para">
  Asimismo, es posible <em>cancelar</em> la subida actual
  definiendo la clave <code class="literal">$_SESSION[$key][&quot;cancel_upload&quot;]</code> al valor
  <strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong>. Durante la subida de varios ficheros en la misma
  petición, esta acción solo cancelará el fichero actualmente en curso de subida,
  así como aquellos en espera de subida, pero no cancelará las subidas
  terminadas con éxito. Cuando una subida es cancelada utilizando este método,
  la clave <code class="literal">error</code> del array <var class="varname"><a href="reserved.variables.files.php" class="classname">$_FILES</a></var> será definida a
  <strong><code><a href="filesystem.constants.php#constant.upload-err-extension">UPLOAD_ERR_EXTENSION</a></code></strong>.
 </p>
 <p class="para">
  Las opciones de configuración INI
  <a href="session.configuration.php#ini.session.upload-progress.freq" class="link">session.upload_progress.freq</a>
  y
  <a href="session.configuration.php#ini.session.upload-progress.min-freq" class="link">session.upload_progress.min_freq</a>
  controlan la frecuencia de actualización de las informaciones de progresión de subida.
  Con una configuración razonable de estas 2 opciones, el sobrecoste en términos
  de carga es casi nulo.
 </p>
 <p class="para">
  <div class="example" id="example-1">
   <p><strong>Ejemplo #1 Ejemplo</strong></p>
   <div class="example-contents"><p>
    Ejemplo de estructura del array que contiene las informaciones de
    subida.
   </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>
    Los datos almacenados en sesión se asemejarán a:
   </p></div>
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$_SESSION</span><span style="color: #007700">[</span><span style="color: #DD0000">"upload_progress_123"</span><span style="color: #007700">] = array(<br /> </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">// La hora de la petición<br /> </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">// Longitud del contenido POST<br /> </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">// Cantidad de bytes recibidos y procesados<br /> </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 cuando el manejador POST ha terminado, con éxito o no<br /> </span><span style="color: #DD0000">"files" </span><span style="color: #007700">=&gt; array(<br />  </span><span style="color: #0000BB">0 </span><span style="color: #007700">=&gt; array(<br />   </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">// Nombre del campo &lt;input/&gt;<br />   // Los 3 elementos siguientes son equivalentes a los en $_FILES<br />   </span><span style="color: #DD0000">"name" </span><span style="color: #007700">=&gt; </span><span style="color: #DD0000">"foo.avi"</span><span style="color: #007700">,<br />   </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">,<br />   </span><span style="color: #DD0000">"error" </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">0</span><span style="color: #007700">,<br />   </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 cuando el manejador POST ha terminado de manejar este fichero<br />   </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">// La hora de inicio de petición<br />   </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">// Cantidad de bytes recibidos y procesados para este fichero<br />  </span><span style="color: #007700">),<br />  </span><span style="color: #FF8000">// Otro fichero, en curso de subida, en la misma petición<br />  </span><span style="color: #0000BB">1 </span><span style="color: #007700">=&gt; array(<br />   </span><span style="color: #DD0000">"field_name" </span><span style="color: #007700">=&gt; </span><span style="color: #DD0000">"file2"</span><span style="color: #007700">,<br />   </span><span style="color: #DD0000">"name" </span><span style="color: #007700">=&gt; </span><span style="color: #DD0000">"bar.avi"</span><span style="color: #007700">,<br />   </span><span style="color: #DD0000">"tmp_name" </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">NULL</span><span style="color: #007700">,<br />   </span><span style="color: #DD0000">"error" </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">0</span><span style="color: #007700">,<br />   </span><span style="color: #DD0000">"done" </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">false</span><span style="color: #007700">,<br />   </span><span style="color: #DD0000">"start_time" </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">1234567899</span><span style="color: #007700">,<br />   </span><span style="color: #DD0000">"bytes_processed" </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">54554</span><span style="color: #007700">,<br />  ),<br /> )<br />);</span></span></code></div>
   </div>

  </div>
 </p>
 <div class="warning"><strong class="warning">Advertencia</strong>
  <p class="para">
   El almacenamiento en búfer de la petición del servidor web debe estar desactivado
   para el buen funcionamiento de esta funcionalidad, de lo contrario PHP solo verá el fichero
   una vez que esté completamente subido. Los servidores como Nginx son conocidos por almacenar en búfer
   grandes peticiones.
  </p>
 </div>
 <div class="caution"><strong class="caution">Precaución</strong>
  <p class="para">
   Las informaciones de progresión de la subida son escritas en sesión antes
   de que un script sea ejecutado. Por consecuencia, cambiar el nombre de sesión mediante
   <span class="function"><a href="function.ini-set.php" class="function">ini_set()</a></span> o <span class="function"><a href="function.session-name.php" class="function">session_name()</a></span> dará una
   sesión sin las informaciones de progresión de la subida.
  </p>
 </div>

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