2014-03-04 78 views
0

我想從android中的服務器下載文件並使用代碼非常類似於answer provided in this thread顯示進度對話框,但我無法獲得內容長度HttpURLConnectiongetContentLength()方法。所有文件的內容長度爲-1。Android HttpURLConnection內容長度

對於同一個文件,我在NSHTTPURLResponseexpectedContentLength方法中得到正確的iOS應用內容長度。

這些方法獲取http連接/響應的內容長度的方式有一些基本的區別嗎?

編輯1:

嘗試以下幾件事情的建議一些答案和評論。

  1. Accept-Encodingidentity
  2. 抓取內容長度的字符串(從報頭字段Content-Length),然後將其轉換爲長
  3. 試過conn.getContent().toString().length()代替getContentLength()

無這些工作的對我來說呢。

最讓我感到困惑的是我得到的內容在iOS中的長度,但不是在Android上。

編輯2:

我的繼承人iOS和Android的代碼進行比較 -

的iOS:

NSURLRequest *request = [NSURLRequest requestWithURL:self.url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:1200.0]; 
NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:NO]; 
[connection scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; 
[connection start]; 

安卓

URL url = new URL(downloadUrlString); 
connection = (HttpURLConnection) url.openConnection(); 
connection .setRequestProperty("Accept-Encoding", "identity"); 
connection.connect(); 

唯一的區別我可以看到正在緩存。 所以我在android代碼中添加了以下代碼,但沒有任何更改。

connection.setUseCaches(true); 
+1

檢查此答案http://stackoverflow.com/a/2294899/719212 – R4j

+0

@ R4j我檢查了鏈接。我試過了,但沒有奏效。在該鏈接中的答案對於返回正確內容長度但對於int來說太大的httprequests更有效。我沒有得到任何內容 - lentgth。 – lukya

+0

根據網絡服務器,協議,連接或下載方法的不同,「Content-length」可能並不總是可用。但對於你的情況,我認爲你應該像ios一樣提出請求(檢查你的頭文件,內容類型...)。或者,也許你應該提供你的ios代碼,然後人們可以幫助你。 – R4j

回答

0

根本原因這個問題原來是Cookies。

我在我的應用程序中的某個活動中使用了Web視圖。一些cookie由Web視圖存儲。所有其他REST api和文件下載請求在沒有這些cookie的情況下工作,但是對於特定類型的請求,cookie是必需的。

顯然,android web視圖和連接請求不像iOS那樣共享cookie。因此,我不得不在我的代碼中進行更改,以確保HttpUrlConnection使用WebKit的cookie存儲。我用method described in the accepted answer for this question做了。

2

試試這個:

HttpURLConnection conn = (HttpURLConnection)url.openConnection(); 
    conn .setRequestProperty("Accept-Encoding", "identity"); 
    conn.connect(); 
+0

感謝您的快速回復,但這沒有奏效。 – lukya

+1

爲我工作!在我的情況下,這是服務器更新的問題,當編碼是gzip時,服務器沒有發送內容長度標題。 – deko

0

,如果你只需要內容長度,你可以嘗試

conn.getContent().toString().length() 

其中conn是HttpURLConnection的對象

+0

我也用這種方法得到-1作爲內容長度。 – lukya

+0

這意味着沒有內容長度,我認爲你的問題不在內容長度。這是連接的方式。正如你所提到的,你通過ISO獲得了文件,並閱讀了內容。這意味着您在連接之前忘記在標題中設置某些內容,或者您​​設置了錯誤的內容。 –