2016-09-23 12 views
1

我試圖使用Asynctask從URL下載文件。在doInBackground()方法中,我像這樣檢索文件大小。來自URL的文件大小與存儲器中的下載文件不相同

lenghtOfFile = conection.getContentLength(); 

這將返回一個整數值。現在,下載繼續,文件完全下載並寫入SD卡。

問題是,在我的postExecute()我想比較URL的文件大小和下載文件的大小。

@Override 
    protected void onPostExecute(String s) { 
     super.onPostExecute(s); 

     //check if the file was download and know how much of it 
     //was downloaded, so as to update ui accordingly 
     if(file.exists()){ 

      Log.e("apiFileSize", String.valueOf(lenghtOfFile)); 
      Log.e("downloadFileSize", String.valueOf(file.length())); 

      //check if the file was completely downloaded 
      if(lenghtOfFile == file.length()){ 
        .... 

正如你可以看到我登錄這兩個值,但它們是不相等的,即使下載跑到自己的最終文件被完全下載。本地存儲(sdcard)中的文件最終大於url中的文件大小。我期望他們是平等的,爲什麼會發生這種情況?我能做什麼?

以下是日誌結果。

09-23 22:44:48.203 26594-26594/com.mobile.soullounge E/apiFileSize﹕ 1298573 
09-23 22:44:48.204 26594-26594/com.mobile.soullounge E/downloadedFileSize﹕ 2696392 

在此先感謝。

+0

下面的答案適合您嗎?如果這麼小心接受? –

回答

1

㈣假定你正在使用HttpURLConnection

默認情況下,這個實現,服務器使用gzip壓縮HttpURLConnection的請求,它會自動解壓縮爲getInputStream()呼叫者的數據。 Therafore getContentLength()不能用於確定文件的大小。

但是!您可以像這樣禁用壓縮:

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

您的服務器也應設置爲正確處理此類情況。

+0

這是一些見解。我所做的是在我的api對象中添加文件大小屬性。該大小是在創建對象時計算的。所以我現在可以在客戶端訪問它。 –

相關問題