feat(nextcloud-files): Hoch- und Herunterladen als Datenstrom, große Dateien in Stücken, ZIP

- Hochladen ohne Pufferung: ganze Datei oder Chunked Upload v2 in 8-MiB-Stücken, Zusammenbau im Hintergrund mit abfragbarem Zustand
- Überschreibschutz (If-None-Match / Entity-Tag-Prüfung), Download mit Range, Content-Disposition und Schutzkopfzeilen von Tessera selbst
- Ordner- und Auswahl-ZIP; jeder Nextcloud-Fehler wird vor dem ersten Byte abgebildet, nie 401/403
- Browser-Hochlader mit Fortschritt, Wiederholung, Abbruch und Aufräumen

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-10-08 18:30:02 +02:00
parent 8bee65c306
commit 4d4a0b31cb
15 changed files with 3431 additions and 6 deletions
+19
View File
@@ -383,3 +383,22 @@ export function findUnknownWelcomeMailPlaceholders(text: string): string[] {
}
return unknown;
}
// --- Nextcloud-Dateien: Uebertragung in Stuecken (quick-261008-mzu, L-06) -----------------------
/**
* Groesse eines Teilstuecks beim Hochladen grosser Dateien (8 MiB). Der Browser
* zerlegt die Datei in Stuecke dieser Groesse, die Tessera-API reicht jedes 1:1
* als Nextcloud-Chunk weiter. Der Wert liegt UNTER den 10 MiB, die der
* `/api-proxy`-Rewrite von Next.js pro Anfragekoerper puffert (ein groesserer
* Koerper wird dort still abgeschnitten) und UEBER den 5 MiB, die Nextcloud als
* Mindestgroesse eines Stuecks (ausser dem letzten) verlangt. Die API lehnt
* Koerper, die groesser sind, mit 413 ab.
*/
export const NEXTCLOUD_FILES_CHUNK_SIZE = 8 * 1024 * 1024;
/**
* Hoechstzahl an Stuecken je Datei (Grenze des Nextcloud-Protokolls: Namen
* 00001 bis 10000). Mit 8-MiB-Stuecken sind das rund 78 GiB je Datei.
*/
export const NEXTCLOUD_FILES_MAX_CHUNKS = 10000;