Spring Boot Webflux: Set Max File Upload Limit for FilePart

Viewed 702

I trying to figure out how to set the max file size that can be uploaded when using Mono<FilePart>. I've tried the following:

properties config

spring.servlet.multipart.max-file-size: 30KB // does not work
spring.codec.max-in-memory-size: 30KB // does not work

WebFluxWebConfigurer

@Configuration
@EnableWebFlux
public class WebConfiguration implements WebFluxConfigurer {

    @Override
    public void configureHttpMessageCodecs(ServerCodecConfigurer configurer) {
//      WebFluxConfigurer.super.configureHttpMessageCodecs(configurer);
        SynchronossPartHttpMessageReader reader = new SynchronossPartHttpMessageReader();
        reader.setMaxParts(1);
        reader.setMaxDiskUsagePerPart(10L * 1024L);
        reader.setEnableLoggingRequestDetails(true);

        MultipartHttpMessageReader multipartReader = new MultipartHttpMessageReader(reader);
        multipartReader.setEnableLoggingRequestDetails(true);
        configurer.defaultCodecs().multipartReader(multipartReader);
    }
}

Using the WebConfiguration causing an exception to be thrown on upload:

2021-08-27 11:19:10.460 ERROR [universal-project-service,,] 14168 --- [ctor-http-nio-4] reactor.netty.http.server.HttpServer     :  

java.lang.NoClassDefFoundError: org/synchronoss/cloud/nio/multipart/PartBodyStreamStorageFactory
    at java.base/java.lang.ClassLoader.defineClass1(Native Method) ~[na:na]
    at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1017) ~[na:na]
    at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:151) ~[na:na]
    at java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader.java:821) ~[na:na]
    at java.base/jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull(BuiltinClassLoader.java:719) ~[na:na]
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:642) ~[na:na]
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:600) ~[na:na]
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178) ~[na:na]
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522) ~[na:na]
    at org.springframework.http.codec.multipart.SynchronossPartHttpMessageReader$SynchronossPartGenerator.<init>(SynchronossPartHttpMessageReader.java:195) ~[spring-web-5.3.5.jar:5.3.5]

At this point I'm a bit at a loss. Any help would be most appreciated!

spring boot v2.4.4

UPDATE:

So I found the issue but I don't like it and I would like to wait to see if there is a better solution.

The issue is SynchronossPartHttpMessageReader has a dependency on org.synchronoss.cloud which is does not come with spring boot (or at least v2.4.4 through v2.5.x). Screen shot below

enter image description here

Here's the maven link and dependency:

https://mvnrepository.com/artifact/org.synchronoss.cloud/nio-multipart-parser/1.1.0

<dependency>
    <groupId>org.synchronoss.cloud</groupId>
    <artifactId>nio-multipart-parser</artifactId>
    <version>1.1.0</version>
</dependency>

NOTE: any other version of this above dependency does not work, must use v1.1.0

After adding this using WebFluxConfigurer works. That's the exception was leading to. Again I don't like having to add an extra dependency in order for something native to Spring to work. I leave this as an update until someone can verify that this is the "correct" solve.

1 Answers

Try with DefaultPartHttpMessageReader

@Configuration
@EnableWebFlux
public class WebConfiguration implements WebFluxConfigurer {
    @Override
    public void configureHttpMessageCodecs(ServerCodecConfigurer configurer) {
        var partReader = new DefaultPartHttpMessageReader();
        partReader.setMaxParts(3);
        partReader.setMaxDiskUsagePerPart(30L* 10000L * 1024L);
        partReader.setEnableLoggingRequestDetails(true);
        MultipartHttpMessageReader multipartReader = new 
        MultipartHttpMessageReader(partReader);
        multipartReader.setEnableLoggingRequestDetails(true);
        configurer.defaultCodecs().multipartReader(multipartReader);
        configurer.defaultCodecs().maxInMemorySize(512 * 1024);
    }
 }
Related