【问题标题】:Android getContentLength always return -1 when downloading apk file下载apk文件时Android getContentLength总是返回-1
【发布时间】:2015-10-07 09:14:35
【问题描述】:

我正在使用以下代码在我的 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。

【问题讨论】:

  • 这可能是后端的问题
  • 您是否验证了该文件确实存在,并且服务器实际上正在为其返回内容长度?
  • 文件长度由服务器处理。您的服务器不提供。
  • 谢谢大家。由@Markus Kauppinen 推荐

标签: android urlconnection


【解决方案1】:

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

引用链接:

默认情况下,HttpURLConnection 的这个实现要求 服务器使用 gzip 压缩,它会自动解压缩 getInputStream() 的调用者的数据。 Content-Encoding 和 在这种情况下,Content-Length 响应标头被清除。压缩包 可以通过在 请求头:

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

设置 Accept-Encoding 请求标头显式禁用 自动解压并保持响应头完整; 调用者必须根据需要处理减压,根据 Content-Encoding 响应的标头。

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

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

【讨论】:

  • 太棒了。像魅力一样工作。非常感谢
猜你喜欢
  • 2014-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-10
  • 1970-01-01
  • 2014-03-06
  • 2021-09-05
相关资源
最近更新 更多