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



我正在尝试使用以下方法获取URL内容的大小:

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);

我在AsyncTaskdoInBackground()内使用它,出于某种原因,conn.getContentLength();在应该返回10136时返回1273

我在常规 Java 应用程序的 Main 中使用了上述代码,conn.getContentLength();返回正确的 10136 值。

为什么它不能在AsyncTask工作?

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

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

(2)默认情况下,HttpURLConnection服务器使用gzip压缩的请求的实现,它会自动为getInputStream()的调用者解压缩数据。在这种情况下,将清除内容编码和内容长度响应标头。

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

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

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

另一种方法是"窥探"网络流量,以观察http标头和数据量以寻找线索。

顺便说一句,url.openStream()url.openConnection().getInputStream()来说是一种方便.

最新更新