2014-03-04 2 views
0

나는 안드로이드 서버에서 파일을 다운로드하려고하는데 answer provided in this thread과 매우 비슷한 코드를 사용하여 진행 대화 상자를 표시하려고합니다. 그러나 HttpURLConnectiongetContentLength() 메서드에서 콘텐츠 길이를 가져올 수 없습니다. 모든 파일의 내용 길이는 -1입니다.안드로이드 HttpURLConnection 콘텐츠 길이

동일한 파일의 경우 iOS 앱에서 콘텐츠 길이가 NSHTTPURLResponseexpectedContentLength 개로 바뀌 었습니다.

이러한 방법으로 HTTP 연결/응답의 콘텐츠 길이를 가져 오는 방법에는 몇 가지 기본적인 차이점이 있습니까?

편집 1 : 몇 가지 답변과 의견을 제안 몇 가지 다음

을 시도했다.

  1. 설정 Accept-Encoding 헤더 대신이 일의 getContentLength()

없음의 긴

  • 시도 conn.getContent().toString().length()로 변환 한 후 identity
  • (헤더 필드 Content-Length에서) 문자열로 콘텐츠 길이를 가져 오기 및에 나를 위해 아직.

    내가 가장 당황한 것은 내가 iOS에서 콘텐츠 길이를 얻지 만 Android에서는 그렇지 않다는 것입니다.

    Heres는 비교를 위해 내 iOS 및 Android 코드 -

    아이폰 OS : EDIT 2

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

    이 유일한 차이점 내가 볼 수 있습니다 캐싱 중입니다. 그래서 나는 안드로이드 코드에서도 다음 줄을 추가했지만 아무것도 바뀌지 않았습니다.

    connection.setUseCaches(true); 
    
  • +1

    답을 확인하십시오. http://stackoverflow.com/a/2294899/719212 – R4j

    +0

    @ R4j 링크를 확인했습니다. 나는 그것을 시도했지만 작동하지 않았다. 이 링크의 응답은 올바른 내용 길이를 반환하지만 int에 비해 너무 큰 httprequests에 대해 더 유효합니다. 나는 어떤 내용 - lentgth을 얻지 않고있다. – lukya

    +0

    웹 서버, 프로토콜, 연결 또는 다운로드 방법에 따라 'Content-length'를 항상 사용할 수있는 것은 아닙니다. 하지만 귀하의 경우에는 귀하가 ios와 같은 요청을해야한다고 생각합니다 (귀하의 헤더, 콘텐츠 유형을 확인하십시오 ...). 아니면 사람들이 당신을 도울 수있는 코드를 제공해야합니다. – R4j

    답변

    0

    근본 원인이다

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

    을 시도 할 수 있습니다 쿠키로 밝혀졌습니다.

    내 응용 프로그램의 활동 중 하나에서 웹보기를 사용하고 있습니다. 일부 쿠키는 웹보기에 저장됩니다. 다른 모든 REST API 및 파일 다운로드 요청은 특정 유형의 요청에 대해서는 해당 쿠키없이 작동하지만 쿠키가 필요합니다.

    분명히, Android 웹보기와 연결 요청은 iOS와 같은 쿠키를 공유하지 않습니다.결과적으로 HttpUrlConnection이 WebKit의 쿠키 저장소를 사용하는지 확인하기 위해 코드를 변경해야했습니다. 나는 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이 문제에 대한 HttpURLConnection의 객체를

    +0

    이 방법을 사용하면 콘텐츠 길이가 -1이됩니다. – lukya

    +0

    이것은 콘텐츠 길이가 없다는 것을 의미합니다. 콘텐츠 길이에 문제가 없다고 생각합니다. 그것은 연결 방법입니다. 언급했듯이 ISO 파일을 받았고 내용을 읽었습니다. 이것은 연결하기 전에 헤더에 무엇인가를 설정하는 것을 잊었거나 뭔가 잘못 설정 한 것을 의미합니다. –

    관련 문제