<?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 => 'es',
  ),
  'this' => 
  array (
    0 => 'features.file-upload.post-method.php',
    1 => 'Cargas de ficheros por m&eacute;todo POST',
    2 => 'Cargas de ficheros por m&eacute;todo POST',
  ),
  'up' => 
  array (
    0 => 'features.file-upload.php',
    1 => 'Gesti&oacute;n de cargas de ficheros',
  ),
  'prev' => 
  array (
    0 => 'features.file-upload.php',
    1 => 'Gesti&oacute;n de cargas de ficheros',
  ),
  'next' => 
  array (
    0 => 'features.file-upload.errors.php',
    1 => 'Explicaci&oacute;n sobre los mensajes de errores de carga de ficheros',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'es',
    '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">Cargas de ficheros por método POST</h2>

  <p class="simpara">
   Esta funcionalidad permite a las personas subir tanto texto como ficheros binarios. Con las funciones de identificación y manipulación de ficheros de PHP, se tiene el control total para definir quién tiene derecho a subir, pero también qué se hará con el fichero una vez que se haya subido.
  </p>
  <p class="simpara">
   PHP es capaz de recibir ficheros emitidos por un navegador conforme a la norma RFC-1867.
  </p>

  <blockquote class="note"><p><strong class="note">Nota</strong>: 
   <strong>Notas de configuración</strong><br />
   <p class="para">
    Véase también las directivas
    <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> y
    <a href="info.configuration.php#ini.max-input-time" class="link">max_input_time</a> en <var class="filename">php.ini</var>
   </p>
  </p></blockquote>

  <p class="para">
   PHP también soporta la carga por el método PUT como en el navegador <span class="productname">Netscape Composer</span> y <span class="productname">Amaya</span> del W3C. Consulte el capítulo sobre el
   <a href="features.file-upload.put-method.php" class="link">soporte del método PUT</a>.
  </p>

  <p class="para">
   <div class="example" id="example-1">
    <p><strong>Ejemplo #1 Formulario de carga de fichero</strong></p>
    <div class="example-contents"><p>
     Un formulario de carga de ficheros puede ser construido creando un formulario específico como este:
    </p></div>
    <div class="example-contents">
<div class="htmlcode"><pre class="htmlcode">&lt;!-- El tipo de codificación de datos, enctype, DEBE ser especificado como se indica a continuación --&gt;
&lt;form enctype=&quot;multipart/form-data&quot; action=&quot;_URL_&quot; method=&quot;post&quot;&gt;
  &lt;!-- MAX_FILE_SIZE debe preceder al campo input de tipo file --&gt;
  &lt;input type=&quot;hidden&quot; name=&quot;MAX_FILE_SIZE&quot; value=&quot;30000&quot; /&gt;
  &lt;!-- El nombre del elemento input determina el nombre en el array $_FILES --&gt;
  Envíe este fichero: &lt;input name=&quot;userfile&quot; type=&quot;file&quot; /&gt;
  &lt;input type=&quot;submit&quot; value=&quot;Enviar el fichero&quot; /&gt;
&lt;/form&gt;</pre>
</div>
    </div>

    <div class="example-contents"><p>
     <code class="literal">_URL_</code> en el ejemplo anterior debe ser reemplazado y apuntar a un fichero PHP.
    </p></div>
    <div class="example-contents"><p>
     El campo oculto <code class="literal">MAX_FILE_SIZE</code> (medido en bytes) debe preceder al campo input de tipo file y su valor representa el tamaño máximo aceptado del fichero por PHP. Este elemento de formulario debe ser siempre utilizado, ya que permite informar al usuario que la transferencia deseada es demasiado grande antes de llegar al final de la carga. Tenga en cuenta que este parámetro puede ser &quot;engañado&quot; fácilmente desde el lado del navegador, por lo que no se debe confiar en él, tratándose finalmente de una funcionalidad de conveniencia del lado del cliente. El parámetro PHP (del lado del servidor) sobre el tamaño máximo de un fichero cargado, no puede ser engañado.
    </p></div>
   </div>
  </p>

  <blockquote class="note"><p><strong class="note">Nota</strong>: 
   <p class="para">
    Asegúrese de que su formulario de carga de fichero contenga <code class="literal">enctype=&quot;multipart/form-data&quot;</code>, de lo contrario, el fichero no será cargado.
   </p>
  </p></blockquote>

  <p class="para">
   La variable global <var class="varname"><a href="reserved.variables.files.php" class="classname">$_FILES</a></var> contendrá toda la información sobre el fichero cargado. Su contenido se detalla en nuestro ejemplo a continuación. Tenga en cuenta que se supone que el nombre de la variable del fichero cargado es <em>userfile</em>, tal como se define en el formulario anterior, pero puede ser cualquier nombre.
   <dl>
    
     <dt><var class="varname"><a href="reserved.variables.files.php" class="classname">$_FILES['userfile']['name']</a></var></dt>
     <dd>
      <p class="para">
       El nombre original del fichero, tal como en la máquina del cliente 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">
       El tipo MIME del fichero, si el navegador ha proporcionado esta información. Por ejemplo, esto podría ser <code class="literal">&quot;image/gif&quot;</code>. Este tipo mime no es verificado por PHP y, por lo tanto, no se debe tomar su valor para sincronizarse.
      </p>
     </dd>
    
    
     <dt><var class="varname"><a href="reserved.variables.files.php" class="classname">$_FILES['userfile']['size']</a></var></dt>
     <dd>
      <p class="para">
       El tamaño, en bytes, del fichero cargado.
      </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">
       El nombre temporal del fichero que será cargado en la máquina servidor.
      </p>
     </dd>
    
    
     <dt><var class="varname"><a href="reserved.variables.files.php" class="classname">$_FILES['userfile']['error']</a></var></dt>
     <dd>
      <p class="para">
       El <a href="features.file-upload.errors.php" class="link">código de error</a> asociado a la carga del fichero.
      </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">
       La ruta completa tal como se envía por el navegador. Este valor no contiene siempre una verdadera jerarquía de carpetas, y no se debe confiar en él. Disponible a partir de PHP 8.1.0.
      </p>
     </dd>
    
   </dl>
  </p>
  <p class="para">
   El fichero cargado será almacenado temporalmente en el directorio temporal del sistema, a menos que se proporcione otro directorio con la directiva <a href="ini.core.php#ini.upload-tmp-dir" class="link">upload_tmp_dir</a> del <var class="filename">php.ini</var>. El directorio por defecto del servidor puede ser cambiado en el entorno a través de la variable <var class="envar">TMPDIR</var>. Modificar el valor de esta variable con la función <span class="function"><a href="function.putenv.php" class="function">putenv()</a></span> en un script PHP será sin efecto. Esta variable de entorno también puede ser utilizada para asegurarse de que otras operaciones funcionen también en los ficheros cargados.
   <div class="example" id="example-2">
    <p><strong>Ejemplo #2 Validación de carga de ficheros</strong></p>
    <div class="example-contents"><p>
     Véase también las funciones <span class="function"><a href="function.is-uploaded-file.php" class="function">is_uploaded_file()</a></span> y <span class="function"><a href="function.move-uploaded-file.php" class="function">move_uploaded_file()</a></span> para más información. El siguiente ejemplo cargará un fichero desde un formulario.
    </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">"El fichero es válido, y ha sido cargado con éxito. Aquí hay más información :\n"</span><span style="color: #007700">;<br />} else {<br />    echo </span><span style="color: #DD0000">"Ataque potencial por carga de ficheros. Aquí hay más información :\n"</span><span style="color: #007700">;<br />}<br /><br />echo </span><span style="color: #DD0000">'Aquí hay algunas informaciones de depuración :'</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">
   El script PHP que recibe el fichero cargado debe poder gestionar el fichero de manera apropiada. Se puede utilizar la variable <var class="varname"><a href="reserved.variables.files.php" class="classname">$_FILES['userfile']['size']</a></var> para recalar todos los ficheros que son demasiado grandes o demasiado pequeños. Se puede utilizar la variable <var class="varname"><a href="reserved.variables.files.php" class="classname">$_FILES['userfile']['type']</a></var> para descartar los ficheros que no tienen el tipo correcto, pero utilizarla únicamente para una serie de verificaciones, ya que este valor está completamente bajo el control del cliente y no es verificado por PHP. Se puede utilizar la información en <var class="varname"><a href="reserved.variables.files.php" class="classname">$_FILES['userfile']['error']</a></var> y adaptar su política en función de los <a href="features.file-upload.errors.php" class="link">códigos de error</a>. Sea cual sea su política, se debe borrar el fichero del directorio temporal o moverlo.
  </p>
  <p class="simpara">
   Si no se selecciona ningún fichero en el formulario, PHP devolverá <code class="literal">0</code> en <var class="varname"><a href="reserved.variables.files.php" class="classname">$_FILES['userfile']['size']</a></var> y nada en <var class="varname"><a href="reserved.variables.files.php" class="classname">$_FILES['userfile']['tmp_name']</a></var>.
  </p>
  <p class="simpara">
   El fichero será borrado automáticamente del directorio temporal al final del script, si no ha sido movido o renombrado.
  </p>
  <div class="example" id="example-3">
   <p><strong>Ejemplo #3 Envío de un array de ficheros</strong></p>
   <div class="example-contents"><p>
    PHP soporta los <a href="faq.html.php#faq.html.arrays" class="link">arrays en HTML</a> así como con los ficheros.
   </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;Imágenes:
&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;Enviar&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() puede prevenir los ataques "filesystem traversal";<br />        // otra validación/limpieza del nombre de fichero puede ser apropiada<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 barra de progreso de carga puede ser implementada utilizando <a href="session.upload-progress.php" class="link">la progresión de la carga a través de las sesiones</a>.
  </p>
 </div><?php manual_footer($setup); ?>