# Bild-Upload-System

Dieses Dokument beschreibt das Bild-Upload-System des Frameworks.

## Funktionen

- Strukturierte Ordnerhierarchie basierend auf Datum und ID
- Automatische Erstellung mehrerer Bildvarianten (Größen)
- Unterstützung für mehrere Dateiformate (JPG, WebP, AVIF)
- Duplikat-Erkennung über SHA256-Hash
- Sicherheitsvalidierung von Dateitypen und -größen
- Performance-Optimierung durch moderne Bildformate

## Ordnerstruktur

Die Bilder werden in folgendem Muster gespeichert:

```
/uploads
└─ /YYYY (Jahr)
   └─ /MM (Monat)
      └─ /DD (Tag)
         └─ /XXX (ID Teil 1)
            └─ /XXX (ID Teil 2)
               └─ /XXX (ID Teil 3)
                  └─ original.jpg
                  └─ thumbnail.jpg
                  └─ thumbnail.webp
                  └─ thumbnail.avif
                  └─ small.jpg
                  └─ small.webp
                  └─ small.avif
                  └─ medium.jpg
                  └─ medium.webp
                  └─ medium.avif
                  └─ large.jpg
                  └─ large.webp
                  └─ large.avif
```

## Bildvarianten

Folgende Bildvarianten werden automatisch erstellt:

- **thumbnail**: 150x150px, quadratisch zugeschnitten
- **small**: 400x400px, proportional skaliert
- **medium**: 800x800px, proportional skaliert
- **large**: 1200x1200px, proportional skaliert

## Dateiformate

Jede Variante wird in folgenden Formaten gespeichert:

- **JPG**: Für universelle Kompatibilität
- **WebP**: Für moderne Browser mit besserer Kompression
- **AVIF**: Für neueste Browser mit bester Kompression (falls PHP-Unterstützung vorhanden)

## Datenbank-Schema

Das System verwendet zwei Tabellen:

### `images`

- `id`: Primärschlüssel
- `filename`: Generierter Dateiname
- `original_filename`: Originaler Upload-Dateiname
- `mime_type`: MIME-Typ des Bildes
- `file_size`: Dateigröße in Bytes
- `width`: Bildbreite in Pixeln
- `height`: Bildhöhe in Pixeln
- `hash`: SHA256-Hash für Duplikat-Erkennung
- `upload_path`: Relativer Pfad zum Bild
- `created_at`: Erstellungszeitpunkt
- `updated_at`: Letzter Aktualisierungszeitpunkt

### `image_variants`

- `id`: Primärschlüssel
- `image_id`: Fremdschlüssel zur `images`-Tabelle
- `variant`: Name der Variante (thumbnail, small, medium, large)
- `format`: Dateiformat (jpg, webp, avif)
- `width`: Bildbreite in Pixeln
- `height`: Bildhöhe in Pixeln
- `file_size`: Dateigröße in Bytes
- `filename`: Name der Variantendatei
- `created_at`: Erstellungszeitpunkt

## Verwendung

### Bild hochladen

```php
// In einem Controller
public function upload(Request $request)
{
    $file = $request->files->get('image');
    $image = $this->imageService->uploadImage($file);

    // URL zu einer Bildvariante erhalten
    $thumbnailUrl = $this->imageService->getImageUrl($image, 'thumbnail', 'webp');
    $mediumUrl = $this->imageService->getImageUrl($image, 'medium', 'jpg');
}
```

### Bild anzeigen

```html
<!-- Optimale Bildauswahl mit picture-Element -->
<picture>
    <source srcset="/media/uploads/2025/06/26/001/234/567/1234567/medium.avif" type="image/avif">
    <source srcset="/media/uploads/2025/06/26/001/234/567/1234567/medium.webp" type="image/webp">
    <img src="/media/uploads/2025/06/26/001/234/567/1234567/medium.jpg" alt="Beschreibung">
</picture>
```

## Technische Details

### Bildverarbeitung

Die Bildverarbeitung erfolgt mit der GD-Bibliothek. Für die Verwendung von AVIF ist PHP 8.1+ mit AVIF-Unterstützung erforderlich.

### Performance

Bilder werden mit Cache-Headers ausgeliefert, die eine lange Browser-Cache-Dauer ermöglichen, um Bandbreite zu sparen und die Ladezeit zu verbessern.

### Sicherheit

Alle Uploads werden validiert, um sicherzustellen, dass nur erlaubte Bildtypen verarbeitet werden. Es werden sichere, eindeutige Dateinamen generiert, um Konflikte zu vermeiden.
