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

时间:2011-11-29 10:05:28

标签: android urlconnection

我有以下代码:

URL url = new URL("http://myserver.com/getFile.php");
URLConnection conexion = url.openConnection();
conexion.connect();
int lenghtOfFile = conexion.getContentLength();

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

知道为什么吗?

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

WiFi案例的整个标题:

{Accept-Ranges = [bytes],Connection = [Keep-Alive],Content-Length = [628254],Content-Type = [text / plain; charset = UTF-8],日期= [星期二,2011年11月29日11:22:50 GMT],ETag = [“7a0c7-9961e-4af3f38778500”],Keep-Alive = [timeout = 15],Last-Modified = [星期五,2011年10月14日09:52:52 GMT],Server = [Apache / 2.2.9(Debian)PHP / 5.2.6-1 + lenny9与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; charset = UTF-8],日期= [星期二,2011年11月29日11:20:33 GMT],ETag = [“7a0c7-9961e-4af3f38778500”],Keep-Alive = [timeout = 15],Last-Modified = [星期五,2011年10月14日09:52:52 GMT],Server = [Apache / 2.2.9(Debian)PHP / 5.2.6-1 + lenny9与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 = [chunked],警告= [214 warkaz-fe07“转换应用”]}

3 个答案:

答案 0 :(得分:1)

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

从标题中可以清楚地看出,您的提供商有一些代理可以进行转换,从而剥离了流程中的内容长度。警告标题清楚地表明了这一点。您可以尝试返回不同类型的内容类型(您现在正在获取text / plain),也许这个特定的代理不会触及它。当然,这不是一个很好的解决方案,运营商可能需要以某种方式“优化”他们的网络。

您还可以使用范围标题尝试HEAD请求,以获得内容大小的大概。在这种情况下,您会猜测一些范围,例如100k,1000k等,以查看服务器是否认为这是可接受的范围。你可以使用那个假范围来取得进步。同样,这不是一个非常好的解决方案,但如果你真的需要进步,那就可以尝试了。

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

答案 1 :(得分:0)

因为您正在使用

new URL("http://myserver.com/getFile.php");

我认为您使用的是已设置的个人服务器,使用WiFi时,您的手机位于本地网络中,从而可以看到您的服务器,但是当您尝试通过GPR / 3G连接时,您正试图从互联网访问本地服务器。

答案 2 :(得分:0)

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