2010-06-06 48 views
31

Tôi phải tải xuống tệp và tôi đang sử dụng this code, về cơ bản là AsyncTask có nghĩa là cập nhật thanh tiến trình. Nhưng, vì tôi không biết kích thước tập tin tôi đã phải sử dụng thanh tiến trình spinner. Vì vậy, làm thế nào tôi có thể nhận được kích thước tập tin trước khi bắt đầu tải về nó để tôi có thể sử dụng một thanh tiến trình bình thường?Làm thế nào để biết kích thước của một tập tin trước khi tải xuống?

+0

Lưu ý rằng bạn nên gọi 'urlConnection.connect()' trước khi cố gắng truy cập vào tiêu đề 'Content-Length'. Không làm như vậy có thể hiệu quả, nhưng không phải trong mọi hoàn cảnh có thể. – Felix

+0

Không biết rằng ... nó làm việc theo cách đó cho tôi, nhưng cảm ơn lời khuyên của bạn. Tôi sẽ chỉnh sửa câu trả lời. – Cristian

Trả lời

69

bạn có thể nhận tiêu đề được gọi là Content-Length tạo thành đối tượng Phản hồi HTTP mà bạn nhận được, điều này sẽ cung cấp cho bạn độ dài của tệp. bạn nên lưu ý, mặc dù một số máy chủ không trả lại thông tin đó và cách duy nhất để biết kích thước thực tế là đọc mọi thứ từ phản hồi.

Ví dụ:

URL url = new URL("http://server.com/file.mp3"); 
URLConnection urlConnection = url.openConnection(); 
urlConnection.connect(); 
int file_size = urlConnection.getContentLength(); 
+0

điều này sẽ hoạt động trên hầu hết các trường hợp, nhưng nếu tệp quá lớn, tệp sẽ không hoạt động. xem bài đăng của tôi bên dưới để biết giải pháp luôn hoạt động: http://stackoverflow.com/a/12271781/878126 –

+0

Bạn nên sử dụng getContentLengthLong() thay vì getContentLength() cho Android 7 trở lên. Bên dưới thích sử dụng Long.parseLong (urlConnection.getHeaderField ("chiều dài nội dung")) – Sandeep

16

bạn thường có thể sử dụng getContentLength, nhưng điều tốt nhất là nó có được độ dài của chính mình (vì nó có thể bỏ qua giá trị tối đa số nguyên nhân).

chỉ phân tích cú pháp giá trị tiêu đề nội dung có độ dài của chính bạn. phân tích cú pháp tốt hơn.

dụ:

final URL uri=new URL(...); 
URLConnection ucon; 
try 
    { 
    ucon=uri.openConnection(); 
    ucon.connect(); 
    final String contentLengthStr=ucon.getHeaderField("content-length"); 
    //... 
    } 
catch(final IOException e1) 
    { 
    } 

làm lưu ý rằng tôi có thể là bất kỳ chuỗi, vì vậy sử dụng cố gắng nắm bắt, và nếu nó là -1, trống rỗng, hoặc null, nó có nghĩa là bạn không thể biết kích thước của tệp vì máy chủ không cho phép.

+1

Nguyên thủy int của Java là một số nguyên có dấu 32 bit; bạn có thể sẽ không vượt qua giá trị tối đa với tiêu đề Content-Type header – mjama

+4

thực sự bạn có thể, khoảng 2GB. –

+0

vì vậy phải làm gì ở phía máy chủ để làm cho nó cho phép ..? –

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