Android2.2以上版本下載網路檔案getContentLength()大小異常

remotesupport發表於2014-09-25
接手一個專案出現一個問題2.2以上的版本下載網路資源不完整無法更新。check程式碼後發現通過HttpURLConnection.getContentLength()獲取的size跟下載下來的file的legth不等。奇怪的是下載3個檔案前2個都pass最後一個下載的檔案的長度比 HttpURLConnection.getContentLength()獲取的size小。自己搭建了個tomcat伺服器就正常了。為什麼.net伺服器就不行。這麼詭異的問題恐怕只能請apache組織來解決了。
      不過經過小弟對
 HttpURLConnection的原始碼的挖掘,發現了HttpURLConnection跟服務互動採用了"gzip"壓縮。所以下載的fileLegth > HttpURLConnection.getContentLength().參考api:
By default, this implementation of HttpURLConnection requests that servers use gzip compression. Since getContentLength() returns the number of bytes transmitted, you cannot use that method to predict how many bytes can be read from getInputStream(). Instead, read that stream until it is exhausted: whenread() returns -1. 
     api上也不推薦是用該方法來驗證檔案的完整性。可目前專案有不能修改伺服器。通過繼續研究api發現這種gzip壓縮方式是可以取消的。取消辦法這http request的head中設定如下引數即可:
     urlConnection.setRequestProperty("Accept-Encoding", "identity"); 
    至此基本上面詭異的問題修復。2.2以上的版本預設都是採用壓縮優化希望大家注意。關於檔案的完整性驗證希望大家還是走md5吧。

相關文章