PHP - Subir archivos

Mayo 2017

El lenguaje PHP permite administrar los archivos enviados (subidos) gracias a un formulario HTML.

Formulario de envío de archivos


Lo primero que se debe hacer es crear un formulario HTML, que permita al usuario abrir una ventana de diálogo para seleccionar el archivo que se desea enviar:
<FORM method="POST" ENCTYPE="multipart/form-data">
          <INPUT type=hidden name=MAX_FILE_SIZE  VALUE=2048>
          <INPUT type=file name="nom_del_archivo">
          <INPUT type=submit value="Enviar">
</FORM>


Es importante que no olvide el atributo ENCTYPE="multipart/form-data" de lo contrario, no tendrá ningún efecto.

Por otra parte el campo MAX_FILE_SIZE indica el tamaño máximo del fichero que puede subir el navegador, pero eso no es suficiente para asegurarse que los archivos subidos no sobrepasarán un determinado tamaño teniendo en cuenta que todos los navegadores no toman en cuenta sistemáticamente este valor. El valor del tamaño máximo del archivo subido es ajustable en el archivo de configuración php.ini.

Configuración de PHP para subir archivos


El archivo de configuración php.ini contiene directivas para autorizar o desautorizar el envío de archivos por medio de un formulario y también configurarlo:

file_uploads= On/Off permite autorizar o desautorizar el envío de archivos.
upload_tmp_dir = directorio permite definir el directorio temporal donde se colocará el archivo cargado.
upload_max_filesize = 2M permite definir el tamaño máximo autorizado del archivo. Si este límite es sobrepasado, el servidor enviará un código de error.
post_max_size indica el tamaño máximo de los datos enviados en un formulario. Esta directiva prima sobre upload_max_filesize, por lo que hay que asegurarse de tener post_max_size supeior a upload_max_filesize
Si no tiene acceso a la configuración (caso de un sitio web alojado en el servidor del proveedor de acceso o en el caso de un alojamiento mutualizado), entonces puede verificar la configuración con la función phpinfo():

<?
  phpinfo();
?> 

Recuperar el archivo con PHP


Puede acceder al archivo y a toda la información con respecto a éste por medio de la variable global $_FILES[].
Para mostrar lo que contiene, puede instalar el script siguiente:
<pre><?  print_r($_FILES); ?></pre>


La salida de este código será de la forma siguiente:
Array
(
    [nom_du_fichier] => Array
        (
            [name] => MiHermozaImage.jpg
            [type] => image/jpg
            [tmp_name] => ruta_completa_del_archivo_subido
            [error] => 0
            [size] => 1000
        )

) 


En el caso que sigue a continuación se trata de una imagen JPEG que pesa 1 Mo.


Los campos $_FILES[name], $_FILES[type], $_FILES|error], $_FILES[size] permiten efectuar tests del tipo de archivo, el tamaño, el nombre y verificar si ha habido errores..

De este modo, podrá tratar los errores de la siguiente manera:
<?      
if ($_FILES['nom_du_fichier']['error']) {
          switch ($_FILES['nom_du_fichier']['error']){
                   case 1: // UPLOAD_ERR_INI_SIZE
                   echo"El archivo sobrepasa el limite autorizado por el servidor(archivo php.ini) !";
                   break;
                   case 2: // UPLOAD_ERR_FORM_SIZE
                   echo "El archivo sobrepasa el limite autorizado en el formulario HTML !");
                   break;
                   case 3: // UPLOAD_ERR_PARTIAL
                   echo "El envio del archivo ha sido suspendido durante la transferencia!";
                   break;
                   case 4: // UPLOAD_ERR_NO_FILE
                   echo "El archivo que ha enviado tiene un tamaño nulo !");
                   break;
          }
}
else {
 // $_FILES['nom_del_archivo']['error'] vale 0 es decir UPLOAD_ERR_OK
 // lo que significa que no ha habido ningún error
} ?> 

Gracias a la función move_uploaded_files() es posible transferir la imagen del directorio temporal a un directorio de destino:

<?

if ((isset($_FILES['nom_del_archivo]['archivo'])&&($_FILES['nom_del_archivo']['error'] ==
 UPLOAD_ERR_OK)) {
$ruta_destino = '/var/www/archivos/';
move_uploaded_file($_FILES['nom_del_archivo']['tmp_name'], $ruta_destino.$_FILES
['nom_del_archivo']['name']);
}
?> 

Consulta también

Artículo original escrito por . Traducido por Carlos-vialfa. Última actualización: 28 de agosto de 2009 a las 18:58 por Carlos-vialfa.
El documento «PHP - Subir archivos» se encuentra disponible bajo una licencia Creative Commons. Puedes copiarlo o modificarlo libremente. No olvides citar a CCM (es.ccm.net) como tu fuente de información.