Spring Webflux limit uploadowanego pliku

Odpowiedz Nowy wątek
2019-03-12 08:50
0

Cześć,

uploaduję sobie plik takim kodem:

@Configuration
public class ApplicationRoute {

    private static final Logger log = LoggerFactory.getLogger(ApplicationRoute.class);

    @Bean
    RouterFunction<ServerResponse> appRoutes() {
        return nest(path("/api"),
                route(POST("/fileupload"), fileUpload()));
    }

    private HandlerFunction<ServerResponse> fileUpload() {
        return request -> {
//            print content length
            System.out.println(request.headers().contentLength().getAsLong());

            return request.body(BodyExtractors.toMultipartData()).flatMap(parts -> {
                        Map<String, Part> map = parts.toSingleValueMap();
                        final FilePart filePart = (FilePart) map.get("file");
                        final String dir = "C:\\JDeveloper\\mywork\\Spring\\SpringTest\\webflux-file-upload\\uploaded";
                        filePart.transferTo(new File(dir + "/" + filePart.filename()));

                        return ServerResponse.ok().body(fromObject("ok, file uploaded"));
                    }
            );
        };
    }
}

i potrzebuję nałożyć limit na wielkość uploadowanego pliku, oczywiście zanim go pobiorę. Jak to zrobić?

Jedyne co udało mi się wykminić to sprawdzanie headera Content-Length, ale to nie jest bezpieczne rozwiązanie. Miał ktoś już taki problem?

Nigdy nie robiłem jeszcze file uploadu w WebFlux (dlatego piszę komentarz ze względu na potencjalne bzdury :D), ale może BodyExtractors.toParts() będzie pomocna w sumowaniu rozmiarów każdego parta i przerywaniu uploadu gdy osiągniesz limit? Ewentualnie nie babrać się w tym, tylko limitować na środowisku produkcyjnym na poziomie reverse proxy? - qbns 2019-03-12 09:05
Właśnie rzecz w tym, że ani w Part ani w ServerRequest nie mogę znaleźć żadnej metody, która zwróciłaby mi wielkość uploadowanego pliku albo nawet całego requestu. - kkojot 2019-03-12 09:31
Jeśli chodzi o wielkość pliku to chyba nie ma innej opcji jak zliczanie jej w trakcie uploadu i ignorowanie transferu jak się osiągnie limit. - qbns 2019-03-12 09:38
W Springu na servletach można było ustawić w propertiesach spring.servlet.multipart.max-file-size=1MB i spring.servlet.multipart.max-request-size=1MB, ale nie wiem w jaki sposób on sprawdzał wielkość requestów. Tutaj faktycznie zostaje mi chyba sprawdzenie najpierw headera Content-Length, a potem sprawdzanie już w trakcie/po skopiowaniu pliku. - kkojot 2019-03-12 09:49
maxFileSize sprawia, że po osiągnięciu 1MB, servlet dalej przyjmuje dane, ale wywala exception i ignoruje dalsze dane (klient pcha dalej). Dodatkowo mamy maxSwallowSize, który przerywa połączenie po osiągnięciu określonego limitu. Nie wiem czy Netty ma jakieś ustawienie podobne do maxSwallowSize z servletów - sam jestem ciekawy - na ten moment mój jedyny pomysł to przerywanie na poziomie reverse proxy. - qbns 2019-03-12 10:04

Pozostało 580 znaków

2019-03-12 12:28
0

A co masz przed api? jakiś apache/nginx? My takie rzeczy ubiliśmy globalnie na poziomie nginxa w confie client_max_body_size 10M. Może wolałbyś to zrobić w ten sposób? I na proxy go "tempować"

Pozostało 580 znaków

2019-03-12 12:41
0

Szczerze mówiąc nie mam pojęcie jeszcze w jakim środowisku będzie deployowana aplikacja. Jeśli będę mógł filtrować jakoś wcześniej requesty to możliwe że tak zrobię. Póki co szukam rozwiązania w javie/webfluxie.

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0