feat(medien): Dateien herunterladen, Upload-Grenzen vereinheitlichen - #297
Merged
Conversation
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
force-pushed
the
feat/media-download
branch
from
September 11, 2026 14:49
7456447 to
2824526
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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 sieContent-Disposition: attachmentmit 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).jpg→attachment; 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?download=1→ keinContent-Disposition, also keine Änderung am bisherigen VerhaltenDer Hook
useMediaDownloadkann 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:
image/*,video/*,audio/*,application/pdfAlles 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, dasacceptstimmt, 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.