Android:URLConnection.getContentLength()给出不正确的值

时间:2013-09-05 11:21:08

标签: java android android-asynctask urlconnection http-content-length

我正在尝试使用以下方式获取网址内容的大小:

URLConnection conn = null;
URL url = null;
url = new URL("https://dl.dropboxusercontent.com/u/90210205/Default.html");
conn = url.openConnection();
conn.connect();
InputStream in = new BufferedInputStream(url.openStream());
int fileSize = conn.getContentLength();
System.out.println("File size " + fileSize);
while (in.read() != -1) {
    i++;
}
in.close();
System.out.println("Read " + i + " bytes of a possible " + fileSize);

我在doInBackground()的{​​{1}}范围内使用此功能,出于某种原因,AsyncTask在返回conn.getContentLength();时会返回1273。< / p>

我在常规Java应用程序的Main中使用了上面的代码,10136返回了正确的10136值。

为什么它不适用于conn.getContentLength();

1 个答案:

答案 0 :(得分:2)

.getContentLength()的描述是它返回Content-Length标题字段的值。在通常情况下,这应该与可读数据量相匹配。然而...

(1)如果使用chunked-encoding发送数据,则标头可能不存在。在这种情况下,.getContentLength()会返回-1,因此此处似乎不是这样。

(2)默认情况下,HttpURLConnection的实现请求服务器使用gzip压缩,并自动解压缩getInputStream()的调用者的数据。在这种情况下,Content-Encoding和Content-Length响应头被清除。

最后一句似乎表明这也不是这里的情况,因为你没有从.getContentLength()获得-1,但相对大小(1273/10136)让我怀疑......

对此的一个测试是通过在请求标头中设置可接受的编码来禁用Gzip编码:

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

另一个是窥探&#39; snoop&#39;网络流量,以观察http标头和数据量的线索。

BTW,url.openStream()url.openConnection().getInputStream()的便利。