2011-09-14 23 views
10

Para tratar con un cuerpo de solicitud grande en HTTP POST o PUT, confiar en HttpServletRequest.getContentLength() no es una buena idea, ya que solo devuelve valores enteros, o -1 para cuerpos de solicitud> 2GB.javax.servlet.HttpServletRequest.getContentLength() devuelve int solo

Sin embargo, no veo ningún motivo, por qué no se deben permitir cuerpos de solicitud más grandes. RFC 2616 dice

Cualquier contenido-longitud mayor que o igual a cero es un valor válido.

¿Es válido usar HttpServletRequest.getHeader('content-length') y analizarlo en Long?

+2

No estoy seguro si se aplica para la carga, pero es posible que también desee ver la codificación fragmentada. – McDowell

+0

Java Servlet salió en 1997; 2 GB era bastante impensable en ese momento. ¿Hubo discos duros de consumo de 1 GB en ese momento? RFC 2616 tiene fecha de 1999. – irreputable

Respuesta

8

Sí, este es un buen enfoque: use getHeader("Content-Length") (en mayúscula) y Long.parseLong(..). Creo que es lo que está haciendo el contenedor, pero está limitado a int por la especificación serlvet.

+1

De hecho, desde el otro lado, también es perfectamente válido hacer un 'response.setHeader (" Content-Length ", String.valueOf (someLong));'. Solo necesita tener cuidado con los límites de 4 GB en ciertos sistemas de archivos de disco y probablemente también con la configuración de tamaño POST de 2 GB del servidor. – BalusC

+0

@McDowell tiene un buen punto sobre "chuncked". (Creo que es extraño procesar archivos> 2G de todos modos ...) – Bozho

+0

@BalusC, ¿podría explicar a qué se refiere con * la configuración de tamaño POST de 2 GB del servidor? Gracias. – Hank

7

Desde Servlet 3.1 (Java EE 7), un nuevo método está disponible, getContentLengthLong():

long contentLength = request.getContentLengthLong(); 

Lo mismo se aplica a su contraparte en la respuesta, setContentLengthLong():

response.setContentLengthLong(file.length()); 
Cuestiones relacionadas