2010-06-06 90 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