美文网首页
Android getContentLength return

Android getContentLength return

作者: pinkong | 来源:发表于2018-04-09 01:02 被阅读0次

    关于URLConnection的getContentLength函数返还-1,网上几乎所有的说法,都是说因为启动了gzip 的缘故。解决方法也很简单:

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

    但是我们注意到getContentLength函数的返还值是int类型的,如果要下载的文件大小超过int的表示范围会怎样?

    今天就遇到这个问题了,我们的应用应用商店有一个2.2G的游戏(2449387037字节,int类型最大2147483648),总是提示下载失败。问题定位到获取文件长度这一行:

    long len = connection.getContentLength();
    

    len总是返还-1,获取不到文件长度,下载库便返回失败了。
    既然getContentLength()不行,那有没有返还long的getContentLengthLong()函数呢?有是有,但是API24才支持啊,肯定不能用。

    抓包看了一下,服务端返会的http header里面的'content-length'是正常的。那我们直接解析header的这个字段不就可以了,如下:

        /**
         * 从头文件得到下载内容的大小
         * @param urlConnection
         * @return
         */
        private long getContentLengthFromHeader(URLConnection urlConnection) {
            List values = urlConnection.getHeaderFields().get("content-Length");
            if (values != null && !values.isEmpty()) {
    
                String sLength = (String) values.get(0);
    
                if (sLength != null) {
                    return Long.parseLong(sLength, 10);
                }
            }
            return -1;
        }
    

    当调用系统的getContentLength函数失败时,再使用这个函数:

            // 开始下载
            long len = connection.getContentLength();
    
            //发现当文件长度大于int的表示范围时,connection.getContentLength()返回-1,所以改为从头部中获取
            if (len < 0) {
                len = getContentLengthFromHeader(connection);
            }
    

    以上~

    相关文章

      网友评论

          本文标题:Android getContentLength return

          本文链接:https://www.haomeiwen.com/subject/lwevhftx.html