Skip to content

feat(medien): Dateien herunterladen, Upload-Grenzen vereinheitlichen - #297

Merged
nichtLehdev merged 1 commit into
mainfrom
feat/media-download
Sep 11, 2026
Merged

feat(medien): Dateien herunterladen, Upload-Grenzen vereinheitlichen#297
nichtLehdev merged 1 commit into
mainfrom
feat/media-download

Conversation

@nichtLehdev

Copy link
Copy Markdown
Owner

Zweiter von drei Teilen. Basis ist #296, deshalb zeigt der Vergleich erst nach dessen Merge nur noch die eigenen Änderungen.

Herunterladen

Aus der Übersicht ließ sich eine Datei bisher nur über Rechtsklick sichern, und zwar unter ihrem Speichernamen (bild-DFbip-1768161264204.jpg). Kachel und Vorschau haben jetzt einen Download-Knopf, der den gepflegten Mediennamen verwendet.

Dafür versteht /api/uploads/[...path] den Parameter ?download=1: dann setzt sie Content-Disposition: attachment mit dem lesbaren Namen aus ?name=. Ohne den Parameter bleibt alles wie bisher — Bilder müssen weiter inline im <img> landen.

Der Wunschname ist Nutzereingabe und wird über eine Positivliste gefiltert. Geprüft an einer echten Datei:

  • Vorstand 2025 (neu).jpgattachment; filename*=UTF-8''Vorstand%202025%20(neu).jpg — Leerzeichen, Klammern und Umlaute bleiben
  • ../../etc/pa"sswd\nX → Pfadtrenner, Anführungszeichen und Zeilenumbruch werden zu Leerzeichen, die echte Endung wird angehängt
  • ohne ?download=1 → kein Content-Disposition, also keine Änderung am bisherigen Verhalten

Der Hook useMediaDownload kann zusätzlich mehrere Dateien zu einem ZIP packen. Das passiert im Browser: JSZip liegt wegen des Social-Media-Exports ohnehin im Bündel und wird erst beim Klick geladen, und der Server muss nicht 200 Bilder gleichzeitig vorhalten. Doppelte Namen bekommen (2). Die Mehrfachauswahl, die das auslöst, kommt im dritten Teil; geprüft ist es trotzdem schon (zwei Dateien, medien.zip, 4,85 MB).

Upload-Grenzen

Die standen doppelt im Code und wichen voneinander ab:

Formular Route
Typen image/*,video/*,audio/*,application/pdf nur JPG, PNG, WebP, GIF
Größe 50 MB 10 MB

Alles dazwischen — ein PDF, ein 30-MB-Foto — endete in einem nackten „Upload fehlgeschlagen“, weil die Antwort der Route verworfen wurde, obwohl sie den Grund genau benennt.

Die Grenzen liegen jetzt einmal in src/lib/media-upload.ts; Formular und Route lesen dieselben Werte, das accept stimmt, und die Begründung der Route erreicht die Oberfläche.

Anmerkung: Die Route wurde damit nicht großzügiger. Sie nahm noch nie Video oder PDF im Medienordner an — das Formular behauptete es nur. Falls das gewünscht ist, wäre es eine eigene Änderung samt Magic-Byte-Prüfung.

Base automatically changed from fix/media-metadata-and-cleanup to main September 11, 2026 14:47
@nichtLehdev
nichtLehdev added this pull request to stack #299 September 11, 2026 14:48
Aus der Übersicht ließ sich eine Datei bisher nur über Rechtsklick sichern, und
zwar unter ihrem Speichernamen ("bild-DFbip-176….jpg"). Kachel und Vorschau
haben jetzt einen Download-Knopf.

Dafür versteht die Upload-Route `?download=1`: sie setzt dann
`Content-Disposition: attachment` samt lesbarem Dateinamen aus `?name=`. Ohne
den Parameter bleibt alles wie bisher, damit Bilder weiter im `<img>` landen.
Der Wunschname ist Nutzereingabe und wird über eine Positivliste gefiltert;
Pfadtrenner und Steuerzeichen fallen weg, Umlaute und Klammern bleiben.

Außerdem standen die Upload-Grenzen doppelt im Code und wichen voneinander ab:
das Formular bot Video, Audio und PDF an und ließ 50 MB durch, die Route nimmt
Bilder bis 10 MB. Alles dazwischen endete in einem nackten "Upload
fehlgeschlagen", weil die Antwort der Route verworfen wurde. Die Grenzen liegen
jetzt einmal in `lib/media-upload.ts`, Formular und Route lesen sie beide, und
die Begründung der Route erreicht die Oberfläche.
@nichtLehdev
nichtLehdev merged commit 7b230f1 into main Sep 11, 2026
8 checks passed
@nichtLehdev
nichtLehdev deleted the feat/media-download branch September 11, 2026 14:58
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant