Subir archivos desde el cliente con PHP

En ocasiones nos interesa que un usuario transfiera archivos a nuestro servidor. Pensemos por ejemplo en una aplicación de comercio electrónico, cuyos artículos se gestionan desde el navegador. Es probable que necesitemos introducir una fotografía del producto. ¿Cómo enviamos los archivos al servidor?

Para subir archivos al servidor, necesitamos incluir un campo de tipo FILE en nuestro formulario. También es recomendable incluir el tipo de codificación «multipart/form-data». Por último el parámetro ACTION del formulario apuntará al archivo PHP que gestionará el archivo subido. Veamos un ejemplo:

El formulario para enviar el archivo:


  
    

El script que recibe el archivo:


  
    

Datos del archivo subido:

Nombre del fichero en el servidor: < ?php echo ($_FILES['userfile']['tmp_name']); ?>
Nombre del fichero original: < ?php echo ($_FILES['userfile']['name']); ?>
Tamaño: < ?php echo ($_FILES['userfile']['size']); ?>
Tipo de archivo: < ?php echo ($_FILES['userfile']['type']); ?>

El campo MAX_FILE_SIZE, que no es obligatorio pero sí conveniente, debe encontrarse antes del campo INPUT y su valor determina el tamaño máximo de archivo que se puede enviar en bytes. Tras la recepción del archivo se definirá en el script PHP destino la matríz asociativa superglobal $_FILES con los siguientes índices:

  • $_FILES[‘userfile’][‘tmp_name’] – El archivo temporal que se ha guardado en el servidor.
  • $_FILES[‘userfile’][‘name’] – El nombre original del archivo enviado.
  • $_FILES[‘userfile’][‘size’] – El tamaño del archivo recibido.
  • $_FILES[‘userfile’][‘type’] – El tipo MIME del archivo si el navigador envio esta informació.
  • $_FILES[‘userfile’][‘error’] – El código de error presentado al subir el archivo. 0 significa que todo fue bien.

Nótese que ‘userfile’ es el nombre del control de tipo ‘file’ del formulario que envió el archivo.

El script PHP que recibe el archivo enviado debe implementar las acciones que se deben llevar a cabo con el archivo acabado de recibir. Sean cual sean las acciones a tomar se debe borrar el archivo temporal o moverlo a algún otro directorio. El archivo recibido será eliminado inmediatamente del directorio temporal al finalizar el script PHP que lo recibió si no ha sido movido o renombrado.

Típicamente se usa una construcción como la siguiente para completar la tarea de envió del archivo:

$nombre_temporal = $_FILES['userfile']['tmp_name'];
$nueva_ubicacion = '/var/www/html/upload/' . $_FILES['userfile']['name'];
if( is_uploaded_file( $nombre_temporal ) {
  move_uploaded_file( $nombre_temporal, $nueva_ubicacion );
}

Primero se define una variable con el nombre temporal y otra con el nombre que tendría si se ha subido correctamente el archivo. Si se ha subido correctamente (is_uploaded_file) entonces mueva el archiv, de su ubicación temporal hacia su ubicación definitiva.