Worum es geht
Dateien können groß sein, und große Dateien kosten Speicher, Netz und Zeit. Es gibt drei Stellen, an denen die Größe zählt: beim Hochladen, beim Herunterladen und im Dateispeicher.
Die Grenzen im Überblick
| Wo | Grenze | Einstellbar? |
|---|---|---|
| eine Datei (Multipart oder Base64) | 25 MB | ja, spring.servlet.multipart.max-file-size |
| alle Dateien eines Requests | 500 MB | ja, spring.servlet.multipart.max-request-size |
| Teile eines Multipart-Requests | 500 | ja, server.tomcat.max-part-count |
| Download | ganze Datei im Arbeitsspeicher, je laufendem Download | – |
| Dateigröße insgesamt | 2 GiB, weil fileSize eine ganze Zahl bis 2³¹−1 ist | nein |
| Dateispeicher je Mandant | kein Kontingent | – |
Die Werte sind so gewählt, dass ein Vorgang alle seine Dateien in einem Request schicken kann, zum Beispiel eine Begehung mit 100 Fotos zu je 5 MB. Ein Request wird ganz oder gar nicht gespeichert. Einzeln hochgeladene Dateien könnten nach einem Abbruch halb verteilt liegen bleiben.
Bei Base64 zählt die Größe der Datei, nicht die des Textes. CDMS rechnet sie aus der Länge des Textes aus, bevor es etwas dekodiert. Alle Base64-Dateien eines Requests zusammen dürfen höchstens so groß sein wie die Request-Grenze.
Was bei einer zu großen Datei passiert
| Was ist zu groß? | Weg | Antwort |
|---|---|---|
| nichts | alle | wird gespeichert |
| eine Datei | Multipart oder Base64 | 413 file-too-large|<bytes> |
| alle Dateien zusammen | Multipart oder Base64 | 413 request-too-large|<bytes> |
| die Zahl der Teile | Multipart | 413 too-many-parts|<anzahl> |
Die Zahl hinter dem | ist die Grenze: in Bytes bei Dateien und Requests, als Anzahl bei den Teilen. file-too-large|26214400 heißt also „höchstens 25 MB je Datei“. In jedem dieser Fälle ist nichts gespeichert. Den Request unverändert zu wiederholen, scheitert genauso.
Nennt der Server keine Grenze, kommt 413 upload-too-large.
Die Grenzen einstellen
Die Voreinstellungen bringt CDMS selbst mit. Setzt deine Anwendung einen der Werte, gilt ihrer. In der application.yaml:
spring:
servlet:
multipart:
max-file-size: 50MB
max-request-size: 1GB
server:
tomcat:
max-part-count: 1000SPRING_SERVLET_MULTIPART_MAX_FILE_SIZE=50MB
SPRING_SERVLET_MULTIPART_MAX_REQUEST_SIZE=1GB
SERVER_TOMCAT_MAX_PART_COUNT=1000Die Request-Grenze muss mindestens so groß sein wie die Datei-Grenze, sonst greift sie zuerst. -1 heißt unbegrenzt.
Warum Downloads die eigentliche Grenze sind
Beim Herunterladen liest CDMS die ganze Datei in den Arbeitsspeicher und schickt sie dann. Der Bedarf ist also ungefähr:
gleichzeitige Downloads × Dateigröße
Zehn gleichzeitige Downloads einer 200-MB-Datei brauchen rund 2 GB Arbeitsspeicher, nur für die Dateien. Deshalb ist CDMS für Dateien bis etwa 25 MB ausgelegt: Dokumente, Bilder, Scans. Für Videos oder große Archive ist ein eigener Speicher besser geeignet, auf den CDMS nur verweist.
Fallen
Wie es weitergeht
- Wie ein Upload aufgebaut ist: Hochladen
- Wie ein Download läuft: Herunterladen
- Wo die Dateien liegen: Speicher-Backends