下载apk文件时,Android getContentLength总是返回-1

时间:2015-10-07 09:14:36

标签: android urlconnection downloadfile

我在Android项目中使用以下代码下载文件:

URL url = new URL(fileUrl);
URLConnection conection= url.openConnection();
conection.setDoOutput(true);
conection.connect();
int lenghtOfFile = conection.getContentLength();

如果 fileUrl 是apk, lenghtOfFile 始终返回-1。
但如果是图像,视频类型,... lenghtOfFile返回正好。

为什么?

我正在使用eclipse,Android SDK修订版23。

1 个答案:

答案 0 :(得分:6)

内容长度并不总是可用,因为默认情况下Android会请求GZIP压缩响应。来源:Android documentation

引用链接:

  

默认情况下,HttpURLConnection的此实现请求   服务器使用gzip压缩,它会自动解压缩   呼叫者getInputStream()的数据。 Content-Encoding和。{   在这种情况下,Content-Length响应标头被清除。 Gzip已   可以通过在中设置可接受的编码来禁用压缩   请求标题:

     

urlConnection.setRequestProperty("Accept-Encoding", "identity");

     

明确禁用Accept-Encoding请求标头设置   自动解压缩并保持响应头完好无损;   根据需要,呼叫者必须根据需要处理减压   响应的Content-Encoding标题。

     

getContentLength()返回传输的字节数,但不能   用于预测可以从getInputStream()读取多少字节   用于压缩流。相反,读取该流直到它   疲惫不堪,即当read()返回-1时。

当然,实际上是否压缩了响应取决于服务器。