From a30d524ec22c43ce3e690f8b993a9aacce0263ad Mon Sep 17 00:00:00 2001 From: a Date: Sat, 13 Jun 2026 00:13:27 +0100 Subject: [PATCH] Fix MultipartFile.transferTo overwrite + maxDPI default 500 (cucumber e2e bugs) --- .../software/common/model/ApplicationProperties.java | 5 ++++- .../java/stirling/software/common/model/MultipartFile.java | 5 ++++- .../common/model/multipart/FileUploadMultipartFile.java | 5 ++++- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/app/common/src/main/java/stirling/software/common/model/ApplicationProperties.java b/app/common/src/main/java/stirling/software/common/model/ApplicationProperties.java index 3a73def65c..28346850dc 100644 --- a/app/common/src/main/java/stirling/software/common/model/ApplicationProperties.java +++ b/app/common/src/main/java/stirling/software/common/model/ApplicationProperties.java @@ -854,7 +854,10 @@ public class ApplicationProperties { private Boolean enableDesktopInstallSlide; private Datasource datasource; private boolean disableSanitize; - private int maxDPI; + // Default mirrors settings.yml.template (maxDPI: 500). Without an explicit default this + // primitive is 0, which makes every DPI check (dpi > maxDPI) fail with "maximum safe limit + // of 0" when the value is not populated from settings. + private int maxDPI = 500; private boolean enableUrlToPDF; private Html html = new Html(); private CustomPaths customPaths = new CustomPaths(); diff --git a/app/common/src/main/java/stirling/software/common/model/MultipartFile.java b/app/common/src/main/java/stirling/software/common/model/MultipartFile.java index 215bedb421..eb20c92ddf 100644 --- a/app/common/src/main/java/stirling/software/common/model/MultipartFile.java +++ b/app/common/src/main/java/stirling/software/common/model/MultipartFile.java @@ -60,7 +60,10 @@ public interface MultipartFile { default void transferTo(Path dest) throws IOException { try (InputStream in = getInputStream()) { - Files.copy(in, dest); + // Spring's MultipartFile#transferTo overwrites an existing destination. Callers commonly + // pass a path from Files.createTempFile(...) (which has already created an empty file), + // so REPLACE_EXISTING is required - a plain Files.copy would throw FileAlreadyExists. + Files.copy(in, dest, java.nio.file.StandardCopyOption.REPLACE_EXISTING); } } } diff --git a/app/common/src/main/java/stirling/software/common/model/multipart/FileUploadMultipartFile.java b/app/common/src/main/java/stirling/software/common/model/multipart/FileUploadMultipartFile.java index 78043d51c3..4272d01b61 100644 --- a/app/common/src/main/java/stirling/software/common/model/multipart/FileUploadMultipartFile.java +++ b/app/common/src/main/java/stirling/software/common/model/multipart/FileUploadMultipartFile.java @@ -72,6 +72,9 @@ public class FileUploadMultipartFile implements MultipartFile { @Override public void transferTo(Path dest) throws IOException { - Files.copy(delegate.uploadedFile(), dest); + // Overwrite semantics like Spring's MultipartFile#transferTo; callers often pass a + // Files.createTempFile(...) path that already exists, so REPLACE_EXISTING is required. + Files.copy( + delegate.uploadedFile(), dest, java.nio.file.StandardCopyOption.REPLACE_EXISTING); } }