> ## Documentation Index
> Fetch the complete documentation index at: https://reduardo.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Subida de Imágenes

> Carga y gestión de imágenes de productos

# Subida de Imágenes

Los productos pueden tener una imagen asociada que se sube al servidor y se almacena en la carpeta `uploads/`.

## Restricciones

| Restricción | Valor |
| - | - |
| **Tamaño máximo** | 2 MB |
| **Formatos permitidos** | JPG, JPEG, PNG, GIF, WEBP |
| **Nombre del archivo** | Generado automáticamente con `uniqid('prod_')` |

## Flujo de Subida

1. El usuario selecciona una imagen en el formulario (`<input type="file">`)
2. El formulario debe tener `enctype="multipart/form-data"`
3. El controlador recibe el archivo en `$_FILES['imagen']`
4. Se valida el tipo y tamaño
5. Se genera un nombre único y se mueve a `uploads/`
6. Se guarda el nombre del archivo en la columna `imagen` de la BD

## Código del Procesamiento

```php theme={null}
private function procesarImagen(): ?string
{
    if (!isset($_FILES['imagen']) || $_FILES['imagen']['error'] !== UPLOAD_ERR_OK) {
        return null;
    }

    $file = $_FILES['imagen'];

    // Validar tamaño (2MB)
    if ($file['size'] > 2 * 1024 * 1024) {
        $_SESSION['error'] = 'La imagen no debe superar 2MB.';
        return null;
    }

    // Validar extensión
    $ext = strtolower(pathinfo($file['name'], PATHINFO_EXTENSION));
    $permitidas = ['jpg', 'jpeg', 'png', 'gif', 'webp'];
    if (!in_array($ext, $permitidas)) {
        $_SESSION['error'] = 'Formato no permitido.';
        return null;
    }

    // Generar nombre único y mover
    $nombreArchivo = uniqid('prod_') . '.' . $ext;
    $destino = __DIR__ . '/../uploads/' . $nombreArchivo;
    move_uploaded_file($file['tmp_name'], $destino);

    return $nombreArchivo;
}
```

## Eliminación de Imágenes

Al eliminar un producto, su imagen asociada también se elimina del disco:

```php theme={null}
private function eliminarImagen(string $nombreImagen): void
{
    $ruta = __DIR__ . '/../uploads/' . $nombreImagen;
    if (file_exists($ruta)) {
        unlink($ruta);
    }
}
```

<Note>
  La carpeta `uploads/` está incluida en el `.gitignore` para no subir imágenes al repositorio. Un archivo `.gitkeep` mantiene la carpeta en Git.
</Note>


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.