首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android URLConnection类无法使用3G互联网连接获取内容长度

Android URLConnection类无法使用3G互联网连接获取内容长度
EN

Stack Overflow用户
提问于 2011-11-29 18:05:28
回答 3查看 1.1K关注 0票数 0

我有下面这段代码:

代码语言:javascript
复制
URL url = new URL("http://myserver.com/getFile.php");
URLConnection conexion = url.openConnection();
conexion.connect();
int lenghtOfFile = conexion.getContentLength();

在我使用WiFi connection之前,一切都很好。如果我尝试在只有GPRS/3G连接可用时运行此代码,conexion.getContentLength()返回-1。

知道为什么吗?

编辑:我已经使用getHeaderFields()检查了头部。如果我使用3G网络,它们是不同的。在这种情况下,基本上没有Content-Length。知道为什么服务器会返回不同的报头吗?我没有使用任何特殊的脚本来提供文件,我只获取放置在给定位置的文件。

WiFi大小写的整个标题:

{Accept-Ranges=bytes,Connection=Keep-Alive,Content-Length=628254,Content-Type=text/plain;字符集=UTF-8,Date=Tue,2011年11:22:50 GMT,ETag="7a0c7-9961e-4af3f38778500",Keep-Alive=timeout=15,上次修改时间=周五,2011年10月14日09:52:52 GMT,服务器=Apache/2.2.9 (Debian) PHP/5.2.6-1+lenny9 with Suhosin-Patch mod_python/3.3.1 Python/2.6.6 mod_ssl/2.2.9 OpenSSL/0.9.8o mod_wsgi/3.3 mod_perl/2.0.4 Perl/v5.10.0}

使用3G时的整个标题:

{Accept-Ranges=bytes,Connection=Keep-Alive,Content-Type=text/plain;字符集=UTF-8,Date=Tue,2011年11:20:33 GMT,ETag="7a0c7-9961e-4af3f38778500",Keep-Alive=timeout=15,上次修改时间=周五,2011年10月14日09:52:52 GMT,服务器=Apache/2.2.9 (Debian) PHP/5.2.6-1+lenny9 with Suhosin-Patch mod_python/3.3.1 Python/2.6.6 mod_ssl/2.2.9 OpenSSL/0.9.8o mod_wsgi/3.3 mod_perl/2.0.4 Perl/v5.10.0,Transfer-Encoding=分块,Warning=214 warkaz-fe07“应用的转换”}

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-11-29 19:16:07

您确定服务器通过在响应中发送Content-Length报头来提供内容长度吗?

从头部可以清楚地看出,您的提供商有某种代理在适当的位置执行转换,在此过程中剥离内容长度。警告标头清楚地指出了这一点。你可以尝试返回不同类型的内容类型(你现在得到的是文本/纯文本),也许这个特定的代理不会接触到它。当然,这不是一个很好的解决方案,运营商可能需要以某种方式“优化”他们的网络。

您还可以尝试使用range标头的HEAD请求,以获得内容大小的大致信息。在这种情况下,您可能会猜测一些范围,如100k、1000k等,以查看服务器是否认为这是一个可接受的范围。你可以在你的进度中使用这个假的范围。再说一次,这不是一个很好的解决方案,但如果你真的需要进步,这是值得尝试的东西。

最后,如果没有已知的长度,最好将进度显示为未知。

票数 1
EN

Stack Overflow用户

发布于 2011-11-29 18:21:09

由于您使用的是

代码语言:javascript
复制
new URL("http://myserver.com/getFile.php");

我假设您使用的是您设置的个人服务器,当使用WiFi时,您的手机在本地网络中,因此可以看到您的服务器,但当您尝试通过GPRs/3G连接时,您正在尝试从互联网访问您的本地服务器。

票数 0
EN

Stack Overflow用户

发布于 2011-11-29 19:15:46

这可能是由于您的运营商的限制。尽量避免需要此值。(例如,通过读取inputStream直到您无法读取它)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8308930

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档