W3docs

is_uploaded_file()

La función is_uploaded_file() de PHP comprueba si un archivo fue subido mediante HTTP POST. Devuelve true si el archivo es válido.

La función is_uploaded_file() comprueba si un archivo dado fue subido a través de una solicitud HTTP POST. Es una de las herramientas de seguridad principales de PHP para la carga de archivos: permite confirmar que una ruta apunta realmente a un archivo temporal que el propio PHP creó a partir de la solicitud actual, y no a una ruta arbitraria que un atacante pudiera haber introducido en tu script.

Este capítulo cubre la sintaxis, un ejemplo funcional, el problema de seguridad que resuelve la función y los errores comunes que hay que evitar.

Sintaxis

is_uploaded_file(string $filename): bool
  • $filename — la ruta a comprobar. En la práctica, siempre es un valor tomado de $_FILES['...']['tmp_name'].
  • Valor de retornotrue si $filename es un archivo subido de la solicitud actual, false en caso contrario.

La función solo devuelve true para el nombre de archivo temporal que PHP asignó durante la carga. Pasar una ruta construida manualmente (por ejemplo, el destino final tras mover el archivo) devuelve false.

Ejemplo básico

<?php

$file = $_FILES['file']['tmp_name'];

if (is_uploaded_file($file)) {
    echo 'The file was uploaded via HTTP POST.';
} else {
    echo 'The file was NOT uploaded via HTTP POST.';
}

Aquí $_FILES['file'] es la entrada creada cuando se envía un campo de formulario llamado file con enctype="multipart/form-data". La clave tmp_name contiene la ruta temporal del servidor, e is_uploaded_file() verifica que realmente proviene de la solicitud.

Por qué existe la función (seguridad)

Sin esta comprobación, un atacante podría enviar un campo de formulario normal (no un archivo) cuyo valor sea una ruta del servidor como /etc/passwd. Si tu código confiara ciegamente en esa cadena y luego la leyera o copiara, estarías exponiendo archivos del sistema. is_uploaded_file() se defiende contra esto devolviendo true solo para archivos que PHP recibió como cargas en la solicitud actual.

Un manejador de carga seguro valida el archivo antes de hacer cualquier cosa con él:

<?php

if (
    isset($_FILES['file']) &&
    $_FILES['file']['error'] === UPLOAD_ERR_OK &&
    is_uploaded_file($_FILES['file']['tmp_name'])
) {
    $destination = __DIR__ . '/uploads/' . basename($_FILES['file']['name']);

    if (move_uploaded_file($_FILES['file']['tmp_name'], $destination)) {
        echo 'File stored safely.';
    } else {
        echo 'Failed to move the uploaded file.';
    }
} else {
    echo 'No valid upload received.';
}

Ten en cuenta que move_uploaded_file() realiza internamente la misma comprobación de is_uploaded_file(), por lo que es la forma preferida de reubicar una carga. Usa is_uploaded_file() directamente solo cuando necesites inspeccionar o leer el archivo temporal antes de moverlo.

is_uploaded_file() vs. move_uploaded_file()

FunciónQué hace
is_uploaded_file()Devuelve un booleano que confirma que la ruta es una carga de la solicitud actual. No toca el archivo.
move_uploaded_file()Comprueba lo mismo y luego mueve el archivo temporal a un destino. Falla (devuelve false) si el origen no es una carga real.

Errores comunes

  • Siempre pasa tmp_name, nunca la ruta final. Después de mover un archivo con move_uploaded_file(), el archivo temporal ya no existe, por lo que volver a comprobarlo devuelve false.
  • La comprobación es por solicitud. Una ruta que fue una carga en una solicitud anterior no es válida en la actual.
  • No valida el contenido. is_uploaded_file() no dice nada sobre el tipo o tamaño del archivo. Valida $_FILES['file']['size'], el tipo MIME y la extensión por separado antes de confiar en los datos del usuario.
  • Comprueba el código de error primero. Inspecciona $_FILES['file']['error'] === UPLOAD_ERR_OK antes de llamar a is_uploaded_file(); una carga fallida puede dejar tmp_name vacío.

Funciones relacionadas

Resumen

is_uploaded_file() devuelve true solo para el archivo temporal que PHP creó a partir de una carga HTTP POST en la solicitud actual. Combinada con el código de error de carga y la validación del contenido, es la base del manejo seguro de archivos en PHP. En la mayoría de los casos dejarás que move_uploaded_file() haga la comprobación por ti, y recurrirás a is_uploaded_file() directamente solo cuando necesites leer el archivo temporal antes de moverlo.

Practice

Práctica
¿Cuál es la función de is_uploaded_file() en PHP?
¿Cuál es la función de is_uploaded_file() en PHP?
Was this page helpful?