2010-02-19 29 views
10

Đúng vậy, tôi đã bắt đầu dự án của mình về việc tạo trình quản lý tải xuống Java đang hoạt động tốt. Vấn đề duy nhất tôi thấy lúc này là khi tôi yêu cầu độ dài nội dung của URL. Khi tôi sử dụng phương thức được cung cấp bởi getContentLength của HttpUrlConnection, nó trả về một Int.Giới hạn trong Java HttpUrlConnection nhận được chiều dài nội dung

Điều này thật tuyệt nếu tôi chỉ tải xuống các tệp có kích thước tệp nhỏ hơn 2GB. Làm một số đào nhiều hơn và thấy rằng java không hỗ trợ giá trị int unsigned, nhưng ngay cả như vậy mà sẽ chỉ cho tôi một kích thước tập tin của một tối đa 4GB.

Bất kỳ ai cũng có thể giúp tôi đi đúng hướng để nhận được kích thước nội dung của tệp lớn hơn 2GB.

Xin cảm ơn trước.

CẬP NHẬT

Cảm ơn bạn trả lời Gentleman Elite, tôi đã cố gắng những gì bạn đề nghị nhưng mà giữ trả lại một giá trị null, nên thay vì những gì tôi đã làm là

HttpURLConnection conn = (HttpURLConnection) absoluteUrl.openConnection(); 
conn.connect(); 
long contentLength = Long.parseLong(conn.getHeaderField("Content-Length")); 

Đối với một số lý do chỉ sử dụng conn .getRequestProperty luôn trả lại một giá trị rỗng cho tôi

+0

Tôi đang tìm 'getHeaderField (...)' nhưng tôi không thể tìm thấy nó. Đó thực sự là cách tốt nhất để làm điều đó .... Tôi đã cập nhật câu trả lời của mình. Ồ vâng, 'getRequestProperty' được sử dụng TRƯỚC KHI thực hiện yêu cầu POST/GET, tức là yêu cầu đó không phải là yêu cầu và không phải là câu trả lời. –

Trả lời

17

Tại sao không thử sử dụng phương thức headerField để nhận được độ dài nội dung? tức là

HttpURLConnection connection = new HttpURLConnection(...); 
long contentLength = Long.parseLong(connection.getHeaderField("Content-Length")); 

Tương đương với connection.getContentLength ngoại trừ giá trị trả về của chuỗi loại. Điều này có thể cho kết quả chính xác về độ dài bit.

CẬP NHẬT: Tôi đã cập nhật nó để sử dụng HeaderField thay vì requestProperty ... nhờ tác giả của câu hỏi.


Nhờ @FlasH từ Ru, bạn có thể đạt được kết quả tương tự khi sử dụng từ JDK 7 trở lên.

Điều này, có hiệu lực gọi phương thức URLConnection.getHeaderFieldLong() mới, cũng đã được giới thiệu trong JDK 7 trở lên.

+0

Hmm điểm tốt, hãy để tôi cho rằng một whirl –

+1

Btw, có một 'connection.getContentLengthLong' có sẵn ngay bây giờ (kể từ Java 7) mà không giống như đề xuất nhưng với một từ ít hơn. –

+0

Dường như giải pháp này cũng sẽ kích hoạt tải xuống. làm thế nào chúng ta có thể nhận được tiêu đề nhưng không bắt đầu tải xuống thực tế để tiết kiệm băng thông? – lucky1928

Các vấn đề liên quan