5

我試圖使用獲得的URL的內容的大小:安卓:URLConnection.getContentLength()給出不正確的值

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

我用這一個AsyncTask和一些doInBackground()內原因conn.getContentLength();正在返回1273當它應該返回10136

我在常規Java應用程序的Main內使用了上述代碼,並且conn.getContentLength();返回正確的10136值。

爲什麼它不在AsyncTask中工作?

+0

您是否使用服務器端的Chunked Transfer Encoding? – axierjhtjz

回答

1

.getContentLength()的說明是它返回Content-Length標題字段的值。在通常情況下,這應該與可供讀取的數據量相匹配。然而...

(1)如果使用分塊編碼來發送數據,則標頭可能不存在。在這種情況下,.getContentLength()返回-1,這樣看起來不是這裏的情況。

(2)默認情況下,HttpURLConnection的實現請求服務器使用gzip壓縮,並自動解壓縮getInputStream()調用者的數據。 Content-Encoding和Content-Length響應頭在這種情況下被清除。

最後一句似乎表明,這也不是這裏的情況,因爲你不是從.getContentLength得到-1()`,但相對規模(10136分之1273)讓我懷疑...

的這個

一種測試將禁用gzip編碼通過在請求頭與設置上可接受的編碼:

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

另一個辦法是「探聽」的網絡流量,以觀察者的線索的HTTP標頭和數據量的。

順便說一句,url.openStream()是方便url.openConnection().getInputStream()