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 retorno —
truesi$filenamees un archivo subido de la solicitud actual,falseen 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ón | Qué 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 conmove_uploaded_file(), el archivo temporal ya no existe, por lo que volver a comprobarlo devuelvefalse. - 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_OKantes de llamar ais_uploaded_file(); una carga fallida puede dejartmp_namevacío.
Funciones relacionadas
move_uploaded_file()— mueve de forma segura un archivo subido a su destino.$_FILESy otros superglobales — cómo se exponen los datos de archivos subidos a tu script.- Carga de archivos en PHP — el formulario HTML completo más el manejador PHP para aceptar archivos.
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.