2011-09-14 9 views
10

Aby obsłużyć dużą treść żądania w protokole HTTP POST lub PUT, poleganie na HttpServletRequest.getContentLength() nie jest dobrym pomysłem, ponieważ zwraca tylko wartości całkowite lub -1 dla organów wniosku> 2 GB.javax.servlet.HttpServletRequest.getContentLength() zwraca tylko int.

Jednak nie widzę powodu, dlaczego większe organy wniosku nie powinny być dozwolone. RFC 2616 mówi

Każda długość zawartości większa lub równa zero jest poprawną wartością.

Czy można użyć HttpServletRequest.getHeader('content-length') i zamiast tego przetworzyć na Long?

+2

Nie wiem, czy to dotyczy przesyłania, ale możesz również chcieć przyjrzeć się kodowaniu kodowanemu. – McDowell

+0

Serwlet Java ukazał się w 1997 roku; 2 GB było wtedy zupełnie nie do pomyślenia. czy w tamtych czasach istniało nawet 1GB twardych dysków? RFC 2616 jest datowany na rok 1999. – irreputable

Odpowiedz

8

Tak, to jest dobre podejście - użyj getHeader("Content-Length") (pisane wielką literą) i Long.parseLong(..). Wierzę, że to właśnie robi kontener, ale jest ograniczony do int przez serlvet spec.

+1

Rzeczywiście, z drugiej strony, jest to również całkowicie poprawne wykonanie 'response.setHeader (" Content-Length ", String.valueOf (someLong));'. Musisz tylko zachować ostrożność przy limitach 4 GB w niektórych systemach plików na dyskach i prawdopodobnie także w konfiguracji rozmiaru POST serwera 2 GB. – BalusC

+0

@McDowell ma dobry punkt o "chuncked". (Wydaje mi się dziwne, że przetwarzam> pliki 2G.). – Bozho

+0

@BalusC, czy mógłbyś wyjaśnić, co rozumiesz przez * konfigurację rozmiaru POST serwera 2 GB *? dzięki. – Hank

7

Od Servlet 3.1 (Java EE 7), nowa metoda jest dostępna, getContentLengthLong():

long contentLength = request.getContentLengthLong(); 

To samo odnosi się do swojego odpowiednika w odpowiedzi setContentLengthLong():

response.setContentLengthLong(file.length()); 
Powiązane problemy