我在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。
答案 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
时。
当然,实际上是否压缩了响应取决于服务器。