2011-09-14 31 views
10

Để xử lý một thân yêu cầu lớn trong HTTP POST hoặc PUT, dựa trên HttpServletRequest.getContentLength() không phải là một ý tưởng hay vì nó chỉ trả về giá trị số nguyên, hoặc -1 cho các cơ quan yêu cầu> 2GB.javax.servlet.HttpServletRequest.getContentLength() trả về int chỉ

Tuy nhiên, tôi không thấy lý do gì, tại sao không nên cho phép các cơ quan yêu cầu lớn hơn. RFC 2616 nói

Bất kỳ chiều dài nội dung nào lớn hơn hoặc bằng 0 là giá trị hợp lệ.

Có hợp lệ để sử dụng HttpServletRequest.getHeader('content-length') và phân tích cú pháp này thành Long thay thế không?

+2

Không chắc chắn nếu nó áp dụng cho tải lên, nhưng bạn cũng có thể muốn xem mã hóa chunked. – McDowell

+0

Java Servlet ra mắt vào năm 1997; 2GB là khá không thể tưởng tượng vào thời điểm đó. thậm chí còn có đĩa cứng người tiêu dùng 1GB trở lại không? RFC 2616 là ngày 1999. – irreputable

Trả lời

8

Có, đây là cách tiếp cận tốt - sử dụng getHeader("Content-Length") (viết hoa) và Long.parseLong(..). Tôi tin rằng đó là những gì các container đang làm, nhưng nó được giới hạn trong int bởi spec spec serlvet.

+1

Thật vậy, từ phía bên kia, nó cũng hoàn toàn hợp lệ để làm một 'response.setHeader (" Content-Length ", String.valueOf (someLong)); Bạn chỉ cần cẩn thận với giới hạn 4GB trên một số hệ thống tệp đĩa nhất định và có lẽ cũng là cấu hình kích thước POST 2GB của máy chủ. – BalusC

+0

@McDowell có một điểm tốt về "chuncked". (Tôi nghĩ rằng đó là lẻ để xử lý> 2G tập tin anyway ..) – Bozho

+0

@BalusC, bạn có thể vui lòng giải thích những gì bạn có nghĩa là * cấu hình kích thước POST 2GB của máy chủ *? cám ơn. – Hank

7

Kể từ Servlet 3.1 (Java EE 7), một phương pháp mới có sẵn, getContentLengthLong():

long contentLength = request.getContentLengthLong(); 

cũng áp dụng như đối tác của mình trên phản ứng, setContentLengthLong():

response.setContentLengthLong(file.length()); 
Các vấn đề liên quan