Subir archivos con PHP

Necesitamos, en primer lugar, un formulario que debe ser de tipo post y multipart/form-data:

 <form method="post" enctype="multipart/form-data">
<!-- opcionalmente podemos poner un límite en bytes del fichero, esto se comprueba antes de subir -->
            <input type="hidden" name="MAX_FILE_SIZE" value="2048">
            Selecciona una foto (tamaño máximo 2K):
            <input type="file" name="foto">
            <input type="submit">

        </form>

Después lo recogemos en PHP dentro de la variable superglobal $_FILES. Contiene la siguiente información:

$_FILES[‘fichero_usuario’][‘name’]
El nombre original del fichero en la máquina del cliente.

$_FILES[‘fichero_usuario’][‘type’]
El tipo MIME del fichero, si el navegador proporcionó esta información. Un ejemplo sería «image/gif». Este tipo MIME, sin embargo, no se comprueba en el lado de PHP y por lo tanto no se garantiza su valor.

$_FILES[‘fichero_usuario’][‘size’]
El tamaño, en bytes, del fichero subido.

$_FILES[‘fichero_usuario’][‘tmp_name’]
El nombre temporal del fichero en el cual se almacena el fichero subido en el servidor.

$_FILES[‘fichero_usuario’][‘error’]
El código de error asociado a esta subida.

Los códigos de error son los siguientes:

UPLOAD_ERR_OK
Valor: 0; No hay error, fichero subido con éxito.

UPLOAD_ERR_INI_SIZE
Valor: 1; El fichero subido excede la directiva upload_max_filesize de php.ini.

UPLOAD_ERR_FORM_SIZE
Valor: 2; El fichero subido excede la directiva MAX_FILE_SIZE especificada en el formulario HTML.

UPLOAD_ERR_PARTIAL
Valor: 3; El fichero fue sólo parcialmente subido.

UPLOAD_ERR_NO_FILE
Valor: 4; No se subió ningún fichero.

UPLOAD_ERR_NO_TMP_DIR
Valor: 6; Falta la carpeta temporal. Introducido en PHP 5.0.3.

UPLOAD_ERR_CANT_WRITE
Valor: 7; No se pudo escribir el fichero en el disco. Introducido en PHP 5.1.0.

UPLOAD_ERR_EXTENSION
Valor: 8; Una extensión de PHP detuvo la subida de ficheros. PHP no proporciona una forma de determinar la extensión que causó la parada de la subida de ficheros; el examen de la lista de extensiones cargadas con phpinfo() puede ayudar. Introducido en PHP 5.2.0.

Comprobamos si nos han enviado un fichero, si es así tenemos que moverlo de la carpeta temporal al destino que queramos:

 if (isset($_FILES['foto'])) {
         //En este caso lo muevo a la carpeta 'fotos'
            move_uploaded_file($_FILES['foto']['tmp_name'],
                    "fotos/" . $_FILES['foto']['name']);
}          

Opcionalmente podemos hacer otro tipo de comprobaciones, tipo, tamaño, etcétera:

 if (isset($_FILES['foto'])) {
            if (strpos($_FILES['foto']['type'], "image")!==false &&
                    $_FILES['foto']['size']<2048){
            move_uploaded_file($_FILES['foto']['tmp_name'],
                    "fotos/" . $_FILES['foto']['name']);
            echo "Imagen subida";
            } else {
                echo "Formato de archivo incorrecto. Debe enviar una imagen menor de 2K";
            }