UploadedFile
in package
Representa un fichero subido por el cliente a través de un formulario multipart/form-data.
Esta clase es el equivalente interno de FacturaScripts a la UploadedFile de Symfony: envuelve
una entrada de $_FILES y añade utilidades de validación (extensiones bloqueadas, comprobación
de MIME real, verificación de imágenes mediante GD) y de movimiento del fichero temporal a su
destino final.
Por seguridad bloquea de raíz cualquier extensión asociada a ejecución de PHP en el servidor
(php, phar, phtml, etc.), incluso si el upload en sí es correcto: isValid() devolverá false
para esos ficheros y getErrorMessage() mostrará un mensaje específico.
El flag $test permite usar la clase en tests sin pasar por is_uploaded_file() ni
move_uploaded_file() (que requieren un upload HTTP real): cuando está activo se usan
rename() y se asume que el fichero es válido a efectos de subida.
Table of Contents
Constants
- BLOCKED_EXTENSIONS : mixed = ['htaccess', 'htm', 'html', 'phar', 'php', 'php...
- Extensiones bloqueadas para evitar la ejecución de código PHP servido desde uploads.
- IMAGE_EXTENSIONS : mixed = ['gif', 'jpeg', 'jpg', 'png', 'webp']
- Extensiones admitidas como imagen válida en `isValidImage()`.
- IMAGE_MIME_TYPES : mixed = ['image/gif', 'image/jpeg', 'image/png', 'image...
- Tipos MIME admitidos como imagen válida en `isValidImage()`.
Properties
- $error : int
- Código de error de la subida. Coincide con las constantes UPLOAD_ERR_* de PHP (UPLOAD_ERR_OK, UPLOAD_ERR_INI_SIZE, UPLOAD_ERR_NO_FILE, etc.).
- $name : mixed
- Nombre original del fichero tal y como lo envió el cliente (no se debe confiar en él).
- $size : mixed
- Tamaño del fichero en bytes según lo reportado por PHP.
- $test : bool
- Si es true, la instancia se trata como un upload simulado: se omite la comprobación `is_uploaded_file()` y los movimientos se hacen con `rename()`. Pensado solo para tests.
- $tmp_name : mixed
- Ruta temporal donde PHP ha guardado el fichero subido.
- $type : mixed
- Tipo MIME declarado por el cliente (no fiable; usar `getMimeType()` para el real).
Methods
- __construct() : mixed
- Construye la instancia a partir de un array compatible con una entrada de `$_FILES`.
- extension() : string
- Devuelve la extensión del nombre original del fichero (sin el punto), o cadena vacía si no hay nombre.
- getClientMimeType() : string
- Tipo MIME declarado por el cliente en la cabecera del formulario.
- getClientOriginalExtension() : string
- getClientOriginalName() : string
- Nombre original normalizado sin componentes de ruta, o cadena vacía si no hay.
- getErrorMessage() : string
- Devuelve un mensaje legible describiendo el estado de la subida.
- getMaxFilesize() : int
- Tamaño máximo de subida permitido por la configuración de PHP, en bytes.
- getMimeType() : string
- Tipo MIME real del fichero, detectado leyendo el contenido del fichero temporal con `mime_content_type()`. Devuelve cadena vacía si no hay fichero temporal o no se puede leer.
- getPathname() : string
- Ruta del fichero temporal donde PHP guardó el upload, o cadena vacía si no hay.
- getRealPath() : string
- Alias de `getPathname()` por compatibilidad con la API de Symfony.
- getSize() : int
- Tamaño del fichero en bytes según lo reportado por PHP en la subida.
- isUploaded() : bool
- Indica si el fichero proviene realmente de un upload HTTP.
- isValid() : bool
- Comprueba que el fichero es seguro y se ha subido correctamente.
- isValidImage() : bool
- Comprueba si el fichero es una imagen válida y segura.
- move() : bool
- Mueve el fichero subido al directorio `$destiny` con el nombre `$destinyName`.
- moveTo() : bool
- Mueve el fichero subido a la ruta completa `$targetPath` (incluyendo nombre de fichero).
- hasBlockedExtension() : bool
- Indica si la extensión del fichero está en la lista negra de extensiones ejecutables como PHP.
- hasParentDirectorySegment() : bool
- parseFilesize() : int
- Convierte un valor de configuración tipo `post_max_size` ("8M", "1G", "512K", etc.) a bytes.
- sanitizeFileName() : string
Constants
BLOCKED_EXTENSIONS
Extensiones bloqueadas para evitar la ejecución de código PHP servido desde uploads.
private
mixed
BLOCKED_EXTENSIONS
= ['htaccess', 'htm', 'html', 'phar', 'php', 'php3', 'php4', 'php5', 'php7', 'php8', 'pht', 'phtm', 'phtml', 'phps', 'shtml']
IMAGE_EXTENSIONS
Extensiones admitidas como imagen válida en `isValidImage()`.
private
mixed
IMAGE_EXTENSIONS
= ['gif', 'jpeg', 'jpg', 'png', 'webp']
IMAGE_MIME_TYPES
Tipos MIME admitidos como imagen válida en `isValidImage()`.
private
mixed
IMAGE_MIME_TYPES
= ['image/gif', 'image/jpeg', 'image/png', 'image/webp']
Properties
$error
Código de error de la subida. Coincide con las constantes UPLOAD_ERR_* de PHP (UPLOAD_ERR_OK, UPLOAD_ERR_INI_SIZE, UPLOAD_ERR_NO_FILE, etc.).
public
int
$error
$name
Nombre original del fichero tal y como lo envió el cliente (no se debe confiar en él).
public
mixed
$name
@var string
$size
Tamaño del fichero en bytes según lo reportado por PHP.
public
mixed
$size
@var int
$test
Si es true, la instancia se trata como un upload simulado: se omite la comprobación `is_uploaded_file()` y los movimientos se hacen con `rename()`. Pensado solo para tests.
public
bool
$test
= false
$tmp_name
Ruta temporal donde PHP ha guardado el fichero subido.
public
mixed
$tmp_name
@var string
$type
Tipo MIME declarado por el cliente (no fiable; usar `getMimeType()` para el real).
public
mixed
$type
@var string
Methods
__construct()
Construye la instancia a partir de un array compatible con una entrada de `$_FILES`.
public
__construct([array<string|int, mixed> $data = [] ]) : mixed
Solo se asignan claves que coincidan con propiedades públicas existentes; el resto se ignoran. Si un valor llega como array (caso típico de uploads múltiples donde PHP entrega arrays paralelos), se toma el primer elemento, de modo que la instancia siempre representa un único fichero.
Parameters
- $data : array<string|int, mixed> = []
-
datos en formato
$_FILES['campo'](o un subárbol equivalente)
extension()
Devuelve la extensión del nombre original del fichero (sin el punto), o cadena vacía si no hay nombre.
public
extension() : string
Se obtiene del nombre proporcionado por el cliente, por lo que no garantiza que el contenido
real coincida con esa extensión. Para validar que un fichero es realmente una imagen usar
isValidImage(), que combina extensión, MIME real y decodificación con GD.
Return values
stringgetClientMimeType()
Tipo MIME declarado por el cliente en la cabecera del formulario.
public
getClientMimeType() : string
No es fiable: el cliente puede manipularlo. Usar getMimeType() para obtener el MIME
detectado a partir del contenido real del fichero.
Return values
stringgetClientOriginalExtension()
public
getClientOriginalExtension() : string
replaced by extension() method
Return values
stringgetClientOriginalName()
Nombre original normalizado sin componentes de ruta, o cadena vacía si no hay.
public
getClientOriginalName() : string
Return values
stringgetErrorMessage()
Devuelve un mensaje legible describiendo el estado de la subida.
public
getErrorMessage() : string
Si el fichero tiene una extensión bloqueada, se devuelve un mensaje específico aunque la
subida en sí no haya tenido errores: la comprobación de extensión bloqueada tiene prioridad
sobre el código UPLOAD_ERR_*.
Return values
stringgetMaxFilesize()
Tamaño máximo de subida permitido por la configuración de PHP, en bytes.
public
static getMaxFilesize() : int
Es el menor entre post_max_size y upload_max_filesize. Si alguna de las dos directivas
está vacía o a 0 (ilimitado), se sustituye por PHP_INT_MAX para que no haga ganar a la
comparación incorrectamente. El valor devuelto siempre es un entero.
Return values
intgetMimeType()
Tipo MIME real del fichero, detectado leyendo el contenido del fichero temporal con `mime_content_type()`. Devuelve cadena vacía si no hay fichero temporal o no se puede leer.
public
getMimeType() : string
A diferencia de getClientMimeType(), este valor no se puede falsificar desde el cliente.
Return values
stringgetPathname()
Ruta del fichero temporal donde PHP guardó el upload, o cadena vacía si no hay.
public
getPathname() : string
Return values
stringgetRealPath()
Alias de `getPathname()` por compatibilidad con la API de Symfony.
public
getRealPath() : string
Return values
stringgetSize()
Tamaño del fichero en bytes según lo reportado por PHP en la subida.
public
getSize() : int
Return values
intisUploaded()
Indica si el fichero proviene realmente de un upload HTTP.
public
isUploaded() : bool
En modo $test siempre devuelve true, lo que permite simular subidas en pruebas
unitarias sin necesidad de que el fichero haya pasado por el SAPI de PHP.
Return values
boolisValid()
Comprueba que el fichero es seguro y se ha subido correctamente.
public
isValid() : bool
Para ser válido debe cumplir las tres condiciones: extensión no bloqueada, código de error
UPLOAD_ERR_OK y haber sido realmente subido (isUploaded()).
Return values
boolisValidImage()
Comprueba si el fichero es una imagen válida y segura.
public
isValidImage() : bool
La validación es estricta y se hace en cuatro pasos: subida correcta (isValid()),
extensión en la lista blanca, MIME real (no el del cliente) en la lista blanca y, si la
extensión GD está disponible, decodificación con imagecreatefromstring() para confirmar
que el contenido es realmente una imagen procesable. Si GD no está cargada, se acepta la
imagen tras superar las validaciones previas.
Return values
boolmove()
Mueve el fichero subido al directorio `$destiny` con el nombre `$destinyName`.
public
move(string $destiny, string $destinyName) : bool
Devuelve false si el fichero no es válido (isValid()), sin tocar nada. Si $destiny
no termina en separador de directorio se añade uno, de modo que el llamador no necesita
preocuparse por la barra final. En modo $test se usa rename(); en producción se usa
move_uploaded_file(), que solo acepta ficheros realmente subidos vía HTTP.
Parameters
- $destiny : string
-
directorio destino (con o sin separador final)
- $destinyName : string
-
nombre que tendrá el fichero en destino
Return values
bool —true si el movimiento se realizó correctamente
moveTo()
Mueve el fichero subido a la ruta completa `$targetPath` (incluyendo nombre de fichero).
public
moveTo(string $targetPath) : bool
Devuelve false si el fichero no es válido. En modo $test usa rename(); en producción
usa move_uploaded_file(). A diferencia de move(), aquí el llamador es responsable de
construir la ruta completa.
Parameters
- $targetPath : string
Return values
boolhasBlockedExtension()
Indica si la extensión del fichero está en la lista negra de extensiones ejecutables como PHP.
private
hasBlockedExtension() : bool
Return values
boolhasParentDirectorySegment()
private
static hasParentDirectorySegment(string $path) : bool
Parameters
- $path : string
Return values
boolparseFilesize()
Convierte un valor de configuración tipo `post_max_size` ("8M", "1G", "512K", etc.) a bytes.
private
static parseFilesize(string $size) : int
Replica la lógica de PHP para parsear estos valores: la parte numérica admite prefijos de base (0x para hex, 0 para octal) y el sufijo final (k/m/g/t) se aplica como múltiplo de 1024 acumulativo mediante caída en cascada del switch. Devuelve 0 si la cadena está vacía.
Parameters
- $size : string
Return values
intsanitizeFileName()
private
static sanitizeFileName(string $fileName) : string
Parameters
- $fileName : string