diff --git a/backend/src/main/java/org/raddatz/familienarchiv/service/DocumentService.java b/backend/src/main/java/org/raddatz/familienarchiv/service/DocumentService.java index 06317642..b7d50f99 100644 --- a/backend/src/main/java/org/raddatz/familienarchiv/service/DocumentService.java +++ b/backend/src/main/java/org/raddatz/familienarchiv/service/DocumentService.java @@ -134,6 +134,7 @@ public class DocumentService { } public void validateBatch(int fileCount, DocumentBatchMetadataDTO metadata) { + // 50-file hard cap keeps FormData requests at a manageable size and protects against runaway bulk uploads. if (fileCount > 50) { throw DomainException.badRequest(ErrorCode.BATCH_TOO_LARGE, "Batch exceeds maximum of 50 files per request"); } diff --git a/frontend/src/lib/components/document/BulkDocumentEditLayout.svelte b/frontend/src/lib/components/document/BulkDocumentEditLayout.svelte index bc76ff5b..6ce93a07 100644 --- a/frontend/src/lib/components/document/BulkDocumentEditLayout.svelte +++ b/frontend/src/lib/components/document/BulkDocumentEditLayout.svelte @@ -110,6 +110,7 @@ async function save() { if (saving) return; saving = true; const entries = Array.from(files.values()); + // 10 files per request keeps multipart bodies well under typical reverse-proxy limits (e.g. nginx default 1 MB client_max_body_size per PDF). const chunkSize = 10; const chunks: FileEntry[][] = []; for (let i = 0; i < entries.length; i += chunkSize) {