2015-10-07 26 views
0

我用下面的代碼在我的Android項目在下載文件時:的Android getContentLength總是返回-1下載apk文件

URL url = new URL(fileUrl); 
URLConnection conection= url.openConnection(); 
conection.setDoOutput(true); 
conection.connect(); 
int lenghtOfFile = conection.getContentLength(); 

如果fileUrl是APK,lenghtOfFile總是返回-1。
但是,如果它是圖像,視頻類型,... lenghtOfFile返回正好。

爲什麼?

我使用Eclipse,Android SDK中的修訂23.

+0

這可能是後端問題 – Blackbelt

+0

您是否驗證過該文件實際存在,並且該服務器實際上是爲其返回一個內容長度? – Sebastian

+0

文件長度應由服務器處理。你的服務器沒有提供。 – hasan83

回答

4

內容長度並不總是可用的,因爲默認的Android請求的gzip壓縮的響應。來源:Android documentation

引用鏈接:

默認情況下,這個實現, 服務器使用gzip壓縮HttpURLConnection請求,它會自動解壓縮爲getInputStream()呼叫者的 數據。在這種情況下,清除響應標頭Content-EncodingContent-Length。 gzip的 壓縮可以通過在 請求報頭中設置上可接受的編碼被禁用:

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

設置Accept-Encoding請求頭明確禁用 自動解壓並離開響應頭完好;根據 Content-Encoding響應標題,呼叫者必須根據需要處理解壓縮。

getContentLength()返回傳輸的字節的數目,並且不能 用來預測多少字節可以從getInputStream() 爲壓縮流讀出。相反,讀取該流直到它被用盡,即read()返回-1

是否實際上壓縮響應取決於服務器當然。

+0

太棒了。像魅力一樣工作。 非常感謝你<3 –

+0

太棒了..節省很多時間.. –