博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
下载网络文件HttpURLConnection.getContentLength()大小为 -...
阅读量:6272 次
发布时间:2019-06-22

本文共 1474 字,大约阅读时间需要 4 分钟。

hot3.png

     做一个andriod系统,测试的时候是在android 2.2系统上测试的一切正常,等发布的时候发现个小问题,就是当程序有更新时,需要重新下载APK,为了友好,做了个进度条,但是在 2.2以上的系统中进度条不会走动,部分代码如下:

 

   HttpURLConnection conn = (HttpURLConnection)url.openConnection();    conn.connect();

 int length = conn.getContentLength();

   InputStream is = conn.getInputStream();

    经过debug,发现是由于,conn.getContentLength() 时获取到的值为 -1,导致计算进度时,结果有误,永远为负数。在网上查资料都说是服务端没有设content length,跟服务端协商,加上这个就行了。但是为毛2.2,的时候就可以服务端也没设啊,查API :Returns the content length in bytes specified by the response header field content-length or -1 if this field is not set.看API也似乎是这个意思。本来打算投降了,跟服务端商量下,看能不能主动加上。突然手贱多点了下查找,发现这么一段话:

      By default this implementation of HttpURLConnection requests that servers use gzip compression. Since getContentLength() returns the number of bytes transmitted, you cannot use that method to predict how many bytes can be read from getInputStream(). Instead, read that stream until it is exhausted: when read() returns -1. Gzip compression can be disabled by setting the acceptable encodings in the request header。

似乎是说,在默认情况下,HttpURLConnection 使用 gzip方式获取,文件 getContentLength() 这个方法,每次read完成后可以获得,当前已经传送了多少数据,而不能用这个方法获取 需要传送多少字节的内容,当read() 返回 -1时,读取完成,由于这个压缩后的总长度我无法获取,那么进度条就没法计算值了。

要取得长度则,要求http请求不要gzip压缩,具体设置如下

 

HttpURLConnection conn = (HttpURLConnection)url.openConnection();

conn .setRequestProperty("Accept-Encoding", "identity");
conn.connect();

int length = conn.getContentLength();

InputStream is = conn.getInputStream();

 

转载于:https://my.oschina.net/u/133352/blog/96582

你可能感兴趣的文章
物联网如何跳出“看起来很美”?
查看>>
浅谈MySQL 数据库性能优化
查看>>
《UNIX/Linux 系统管理技术手册(第四版)》——1.10 其他的权威文档
查看>>
灵动空间 创享生活
查看>>
《UNIX网络编程 卷1:套接字联网API(第3版)》——8.6 UDP回射客户程序:dg_cli函数...
查看>>
不要将时间浪费到编写完美代码上
查看>>
《第一桶金怎么赚——淘宝开店创业致富一册通》一一第1章 创业梦想,怎样起步...
查看>>
基于容器服务的持续集成与云端交付(三)- 从零搭建持续交付系统
查看>>
《算法基础:打开算法之门》一3.4 归并排序
查看>>
高德开放平台开放源代码 鼓励开发者创新
查看>>
《高并发Oracle数据库系统的架构与设计》一2.5 索引维护
查看>>
《Exchange Server 2010 SP1/SP2管理实践》——2.4 部署外部网络环境
查看>>
Firefox 是 Pwn2own 2014 上攻陷次数最多的浏览器
查看>>
阿里感悟(十八)- 应届生Review
查看>>
《计算广告:互联网商业变现的市场与技术》一第一部分 在线广告市场与背景...
查看>>
话说模式匹配(5) for表达式中的模式匹配
查看>>
《锋利的SQL(第2版)》——1.7 常用函数
查看>>
《Arduino家居安全系统构建实战》——1.5 介绍用于机器学习的F
查看>>
jquery中hover()的用法。简单粗暴
查看>>
线程管理(六)等待线程的终结
查看>>