Configuración

Para subir archivos utilizando la etiqueta HTML: form es necesario conocer la configuración de nuestro servidor Web, en este caso, Apache. Dentro del archivo, vemos una serie de valores que deben revisarse previamente.

Implementación

El archivo se subirá por medio de un formulario HTML, por lo que es necesario realizar ciertas acciones:

<form action="destino.php" method="post" enctype="multipart/form-data">
  <input type="file" name="archivo" />
  <input type="submit" value="Subir" />
</form>

Como se observa, en el form debe colocarse el atributo enctype="multipart/form-data", con esto se permite la subida de datos. Además es necesario utilizar una etiqueta input del tipo file para realizar la acción.

Manipulación

En el archivo que manipula los datos enviados por medio de POST, se hará uso del arreglo bidimensional $_FILES, la cual tiene los siguientes valores:

<?php

$ruta = 'subida/';

if (isset($_FILES['archivo'])) {
    $name = $_FILES['archivo']['name'];
    $type = $_FILES['archivo']['type'];
    $tmp_name = $_FILES['archivo']['tmp_name'];
    $size = $_FILES['archivo']['size'];
    $error = $_FILES['archivo']['error'];

    if ($error == 0) {
        // Puede determinar un tamaño especifico en bytes
        if ($size > 5 * 1000000) {
            echo 'Tamaño excede los 5MB';
        }
        // Verificar si el archivo tiene un tipo específico (PHP no asegura que esto sea verdad)
        else if (strpos($type, 'image') === false) {
            echo 'No es una imagen';
        }
        // Si no hay errores se intenta insertar
        else {
            // basename() obtiene el nombre de archivo de la ruta de un directorio.
            $destino = $ruta . basename($name);

            // Mueve el archivo del archivo temporal al de destino
            $operacion = move_uploaded_file($tmp_name, $destino);

            // Comprobacion de la operacion
            if ($operacion) {
                echo 'Subida exitosa';
            } else {
                echo 'Hubo un error en la subida del archivo';
            }
        }
    } else {
        $error_tipos = array (
            1 => 'The uploaded file exceeds the upload_max_filesize directive in php.ini.',
            2 => 'The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form.',
            3 => 'The uploaded file was only partially uploaded.',
            4 => 'No file was uploaded.',
            6 => 'Missing a temporary folder.',
            7 => 'Failed to write file to disk.',
            8 => 'A PHP extension stopped the file upload.'
        );
        echo $error_tipos[$error];
    }
}

Una vez configurado ambos archivos es necesario verificar los permisos que tengan tanto la carpeta temporal como la carpeta donde se copiarán los archivos subidos.