okhttp response.body().contentLength()=-1

本文探讨了在使用OkHttp进行文件下载时遇到的文件长度显示为-1的问题,通过检查服务器响应头、Content-Type及编码类型,最终发现并解决了由于Chunked模式导致的Content-Length缺失问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题:

在使用okhttp下载文件的时候拿到的文件长度为-1

解决思路

1.看服务器返回的请求头是否含有Content-Length

cmd 打开命令窗口输入 curl -i +下载链接

窗口显示 connect-length 是有数值的

2.看返回的content-type 

content-type类型 https://www.runoob.com/http/http-content-type.html

第一个返回  text/plain; charset=utf-8 表示文本类型

第二个返回 application/octet-stream表示二进制数据库一般表示文件,第二个是可以可以拿到长度的

3.看自己代码中返回的请求头

chuncked 参考

 https://zhuanlan.zhihu.com/p/65816404

http://www.eit.name/blog/read.php?515

发现能显示的请求头里有Content-Length而不能显示长度的请求头里有没有content-type且多了Transfer-Encoding:chunked,在chuncked模式下是没有Content-Length的。

4.发现了问题 告知服务端,然后继续寻找解决办法,发现https://blog.csdn.net/z_sawyer/article/details/78668790在头部增加

addHeader("Accept-Encoding","identity")可以拿到Content-Length。identity表示不对内容编码,自然也不会采用chuncked模式。编码类型参考http://www.helpsd.net/library/networking/http/http-content-encoding/22 但是没有chuncked可能内容太老了。

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值