2010-06-06 121 views
31

我必須下載一個文件,我正在使用this code,它基本上是一個AsyncTask,它意在更新進度條。但是,因爲我不知道文件大小是什麼,我一直不得不使用微調器進度條。那麼,如何在開始下載文件之前獲取文件大小,以便我可以使用正常的進度條?如何在下載之前知道文件的大小?

+0

請注意,您應該在嘗試訪問Content-Length標頭之前調用'urlConnection.connect()'。不這樣做可能會起作用,但不是在所有可能的情況下。 – Felix 2010-06-06 15:47:00

+0

不知道......它爲我工作,但謝謝你的建議。我要編輯答案。 – Cristian 2010-06-06 16:00:28

回答

69

你可以得到一個名爲Content-Length的頭文件,它構成你得到的HTTP Response對象,這會給你文件的長度。 儘管如此,你應該注意到,有些服務器不會返回這些信息,而知道實際大小的唯一方法是從響應中讀取所有內容。

例子:

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

這可以在大多數情況下使用,但是如果文件太大,則不起作用。請參閱以下我的帖子以獲取始終有效的解決方案:http://stackoverflow.com/a/12271781/878126 – 2013-09-17 12:18:56

+0

對於Android 7及更高版本,您應該使用getContentLengthLong()而不是getContentLength()。在那裏更喜歡使用Long.parseLong(urlConnection.getHeaderField(「content-length」)) – Sandeep 2017-08-10 13:48:26

16

通常可以使用getContentLength,但最好的辦法是自己得到的長度(因爲它可以繞過整的最大值)。

只是自己解析內容長度標題值。更好地解析它。

例如:

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

也請注意,我可以是任何字符串,所以使用try catch和如果是-1,空,或爲空,這意味着你可以不知道的大小因爲服務器不允許它。

+1

Java的int原語是一個32位有符號整數;你可能不會超過最大值,實際上你可以使用Content-Type標頭 – mjama 2013-03-29 05:07:27

+4

,它大約是2GB。 – 2013-03-29 06:48:11

+0

那麼在服務器端要做些什麼才能讓.. ..? – 2014-03-01 09:01:12

相關問題