Eine schlanke, token-geschützte Web-App zum gemeinschaftlichen Hochladen und Anzeigen von Fotos (z. B. auf Hochzeiten). Enthält eine Galerie mit Lightbox, Mehrfach-Upload, serverseitigen Endpunkten, Caching-Headern sowie optionaler Synchronisation mit Nextcloud per WebDAV.
- Token-geschützter Zugriff: Zugang via URL-Token, 7 Tage Session-Gültigkeit
- Mehrfach-Upload: Drag/Drop bzw. Dateiauswahl (Frontend) →
upload.php - Galerie & Lightbox: Grid-Galerie, Vollbild-Ansicht, Keyboard-Navigation →
gallery.js - Bilder-Auslieferung: Serverseitig via
img.php(kein Direktzugriff aufimg/) - Performanz:
gallery.phpliefert ETag/Last-Modified und unterstützt 304-Responses - Sicherheit:
.htaccessverhindert Directory Listing und blockiert sensible Dateien - Nextcloud-Sync (optional):
sync-to-nextcloud.phplädt neue Dateien zu Nextcloud hoch und hält den lokalen Cache aktuell
- PHP ≥ 8.0 (u. a. wegen
str_starts_with) - PHP-Erweiterungen:
curl,simplexml,fileinfo - Webserver mit
.htaccess-Unterstützung (empfohlen: Apache). Hinweis: Root-.htaccessverwendet teilweise ältere Direktiven (Apache 2.2). Unter Apache 2.4 ggf.mod_access_compataktivieren oder Regeln anpassen. - Schreibrechte für den Webserver auf die Ordner
upload/undimg/
- Projektdateien in das Webroot (oder Unterverzeichnis) deployen.
- Ordner anlegen (falls nicht vorhanden) und Rechte setzen:
img/(Cache für Anzeige)upload/(temporäre Uploads, wird nach Nextcloud-Upload geleert)
- Konfiguration in
config/config.phpanpassen:ACCESS_TOKEN: geheimer Zugriffstoken, den Besucher per Link/QR erhaltenNEXTCLOUD_URL: WebDAV-URL des Zielordners (endet mit/)NEXTCLOUD_USER/NEXTCLOUD_PASS: WebDAV-Zugangsdaten
- Webserver-Konfiguration prüfen:
.htaccessim Root schützt u. a.token.php, verhindert Direktzugriff aufimg/und beschränktsync-to-nextcloud.phpauf localhost (127.0.0.1) und eine Beispiel-IP. Passen Sie die IPs bei Bedarf an..htaccessinconfig/blockiert direkten Zugriff auf Konfigurationsdateien.
- Seite aufrufen mit Token, z. B.:
https://example.org/index.php?token=DEIN_GEHEIMER_TOKENNach erfolgreicher Prüfung wird der Token in der Session gespeichert (7 Tage) und aus der URL entfernt.
- Fotos hochladen: Auf der Startseite Dateien auswählen und hochladen. Erfolgreiche Uploads erscheinen sofort oben in der Galerie.
- Galerie ansehen: Klick auf ein Bild öffnet die Lightbox. Navigation per Pfeiltasten Links/Rechts oder per Buttons.
/ (Webroot)
├─ index.php # Startseite (lädt JS/CSS, prüft Zugriff)
├─ upload.php # POST-Upload-Endpunkt
├─ gallery.php # Liefert JSON-Liste der Bilder (mit ETag)
├─ img.php # Liefert einzelne Bilder (no-store)
├─ token.php # Zugriffskontrolle via URL-Token + Session
├─ sync-to-nextcloud.php # Optionaler Sync mit Nextcloud (WebDAV)
├─ access_denied.php # 403-Seite bei fehlendem Zugriff
├─ .htaccess # Sicherheit/Restriktionen (Root)
├─ /config
│ ├─ config.php # Token & Nextcloud-Zugangsdaten
│ └─ .htaccess # Blockiert Zugriff auf .php/.ini/.env
├─ /css
│ └─ style.css # Basis-Styles für App & Lightbox
├─ /js
│ ├─ gallery.js # Galerie + Lightbox-Logik
│ └─ upload.js # Upload-Logik (Fetch → upload.php)
├─ /img # Cache für Anzeige (vom Server gelesen)
└─ /upload # Temporäre Uploads (werden nach Nextcloud-Upload entfernt)
- Token-Lebensdauer: Standard 7 Tage. Anpassbar in
token.php($_SESSION['token_expires']). - HTTPS: Unbedingt HTTPS verwenden; Token niemals im Klartext transportieren.
- Beschränkung direkter Zugriffe:
- Root-
.htaccessdeaktiviert Directory Listing (Options -Indexes). - Direkter Zugriff auf
img/ist untersagt. Bilder werden ausschließlich überimg.phpausgeliefert. token.phpist per.htaccessgesperrt und wird nur viarequiregenutzt.
- Root-
- Upload-Validierung:
- Serverseitig werden Dateiendungen gefiltert (
jpg,jpeg,png,gif). - Für zusätzliche Sicherheit empfiehlt sich eine Inhaltsprüfung (MIME/Exif) und ggf. eine Umwandlung/Neukodierung der Bilder.
- Serverseitig werden Dateiendungen gefiltert (
- PHP-Limits: Passen Sie
upload_max_filesize,post_max_sizeundmax_file_uploadsin Ihrerphp.inian. - Berechtigungen: Webserver-Benutzer benötigt Schreibrechte auf
upload/undimg/.
GET gallery.php- Antwort: JSON-Array
[{ "src": "img.php?file=…", "filename": "…" }, …] - Header:
ETag,Last-Modified,Cache-Control: public, max-age=3600 - Liefert
304 Not Modified, wenn Client aktuell ist.
- Antwort: JSON-Array
GET img.php?file=DATEINAME- Antwort: Bilddaten (korrekter
Content-Type) - Header:
Cache-Control: no-store,Pragma: no-cache,Expires: 0
- Antwort: Bilddaten (korrekter
POST upload.php- Erwartet:
multipart/form-datamitfiles[] - Antwort:
{ "uploaded": ["…", …] }oder{ "error": "…" }
- Erwartet:
Alle Endpunkte sind durch checkAccess() geschützt und erfordern eine gültige Session (zuvor über URL-Token gesetzt).
Das Skript sync-to-nextcloud.php übernimmt zwei Aufgaben:
- Uploads nach Nextcloud: Dateien aus
upload/werden via WebDAVPUTnachNEXTCLOUD_URLhochgeladen. Bei Erfolg werden lokale Dateien inupload/gelöscht. - Cache aktualisieren: Per WebDAV
PROPFINDwerden Bilder im Nextcloud-Ordner ermittelt. Neue Dateien werden inimg/heruntergeladen (falls nicht vorhanden); Bilder, die in Nextcloud gelöscht wurden, werden ausimg/entfernt.
- CLI (empfohlen, z. B. per Cron):
php /pfad/zur/app/sync-to-nextcloud.php- Beispiel-Cron:
*/5 * * * * php /var/www/html/sync-to-nextcloud.php >/dev/null 2>&1
- HTTP (lokal/netz-intern):
- Root-
.htaccesserlaubt per Default nur127.0.0.1und eine Beispiel-IP. Passen Sie dies an oder rufen Sie das Skript direkt per CLI auf.
- Root-
NEXTCLOUD_URLmuss auf das Zielverzeichnis unter WebDAV zeigen, z. B.https://nextcloud.example.org/remote.php/dav/files/USER/Photos/- Gültige WebDAV-Zugangsdaten (
NEXTCLOUD_USER,NEXTCLOUD_PASS)
- Mit dem PHP-Built-in-Server starten (Hinweis:
.htaccesswird hier nicht berücksichtigt):php -S localhost:8000 -t /pfad/zur/app
- Für realistische Tests (inkl.
.htaccess) Apache/Nginx verwenden.
- 403 Zugriff verweigert: Token fehlt/ist abgelaufen. Seite mit
?token=…aufrufen; Session-Cookies erlauben. - Bilder werden nicht angezeigt: Schreibrechte für
img/prüfen;fileinfo-Extension aktiv; Aufruf erfolgt überimg.php(Direktzugriff ist gesperrt). - Upload schlägt fehl: Rechte auf
upload/prüfen; PHP-Upload-Limits; Server-Error-Log kontrollieren. - Nextcloud-Fehler: URL/Benutzer/Passwort prüfen; WebDAV erreichbar; HTTP-Statuscode im Skript-Output beachten.
Die Anwendung speichert Bilder auf dem Server und optional in Ihrer Nextcloud-Instanz. Informieren Sie Nutzer über Speicherort und Aufbewahrungsdauer und nutzen Sie ausschließlich gesicherte Verbindungen (HTTPS).