2013-04-15 4 views
0

Android 앱에서 다운로드를하고 있는데 다운로드 한 퍼센트를 표시하려면 content_length를 얻어야합니다.urlConnection에 대해 getContentLength()가 실패했습니다. 다운로드 비율을 계산할 수 없습니다.

파일은 내 클라이언트가 설치된 서버에 있습니다. 이 서버에서 getContentLength()를 호출하면 -1이 반환됩니다.

THIS SERVERS HEADER DOESN'T WORK WITH urlConnection.getContentLength() 


    $ curl --head "http://www.server0.com/ango/thefile.m4v" 
    HTTP/1.1 200 OK 
    Set-Cookie: JSESSIONID=A17762C6B65FD8D35840110F8628DE4B.V5; Path=/; HttpOnly 
    X-ServedBy: web114 
    Set-Cookie: SS_MID=7315b0cb-054c-4dd8-a013-c7163793becehfjcndg8; Domain=.tangoberretin.com; Expires=Thu, 13-Apr-2023 07:57:07 GMT; Path=/ 
    Pragma: cache 
    Cache-Control: private,max-age=86400 
    Last-Modified: Thu, 21 Feb 2013 06:28:24 GMT 
    Content-Disposition: attachment; filename="thefile.m4v"; 
    Accept-Ranges: bytes 
    Content-Range: bytes 0-6716578/6716579 
    Content-Type: application/octet-stream;charset=UTF-8 
    Content-Length: 6716579 
    Date: Mon, 15 Apr 2013 07:57:07 GMT 
    Server: SSWS 
    Set-Cookie: WebPersCookie=Gn5lN9r2EIK+3eKz0tv/bEs4IJpcBzYg22jKvv/JD1eAA1N3D0pevaz3zuXOD3uTT950AQdstGRJgdE=; path=/ 

그래서 내가 테스트를하고 내 자신의 서버 (아파치)에 파일을 넣어 모든 것이 잘 작동 : 여기 헤더입니다. 그 헤더는 다음과 같습니다.

THIS SERVERS HEADER WORKS WITH urlConnection.getContentLength() 


    $ curl --head "http://server1.net/wp-content/video/thefile.m4v" 
    HTTP/1.1 200 OK 
    Date: Mon, 15 Apr 2013 07:57:42 GMT 
    Server: Apache 
    Last-Modified: Sun, 14 Apr 2013 23:49:00 GMT 
    Accept-Ranges: bytes 
    Content-Length: 502365 
    Content-Type: text/plain 

그럼 첫 번째 경우가 실패의 원인이며 그 원인은 무엇입니까? 이상적으로는 파일을 그대로 두는 것이 좋습니다.

* UPDATE * * 나는 안드로이드 응용 프로그램에서 헤더를 인쇄 한, 분명히 서버가 안드로이드 에이전트에 대한 콘텐츠 길이를 보내지 않습니다

. 내가

HTTP/1.1 200 OK 
Accept-Ranges : 
bytes 
Cache-Control : 
private,max-age=86400 
Content-Disposition : 
attachment; filename="04Left_Turning_Check_Step.m4v"; 
Content-Range : 
bytes 0-7019776/7019777 
Content-Type : 
application/octet-stream;charset=UTF-8 
Date : 
Mon, 15 Apr 2013 08:39:06 GMT 
Last-Modified : 
Wed, 02 Jan 2013 18:40:09 GMT 
Pragma : 
cache 
Server : 
SSWS 
Set-Cookie : 
JSESSIONID=0B1D0CFFD975ED2736BFF7BBC23ACD96.V5; Path=/; HttpOnly 
SS_MID=5a7bd305-4ac1-4d4d-98a3-67fa26c0db56hfje5d3d; Domain=.tangoberretin.com; Expires=Thu, 13-Apr-2023 08:39:06 GMT; Path=/ 
WebPersCookie=WIo8mRMTANAAke3GEsDOsONkGZoRcVvqpC4Am/pl/3WFB9hSEGH5DfGiDSKJDLc2nbZBpWFy3/Yfb3s=; path=/ 
Transfer-Encoding : 
chunked 
Vary : 
Accept-Encoding 
X-Android-Received-Millis : 
1366015147201 
X-Android-Sent-Millis : 
1366015146842 
X-ServedBy : 
web115 
+0

전송 - 인코딩 : HttpURLConnection의에 의해 그 기본 설정을 gzip을, 내가 설명 : 청크는 인코딩을 적용하여 원인 일 수 있습니다 그것은 또 다른 질문과 함께 도움이되기를 바랍니다. http://stackoverflow.com/a/23490011/1294681 – VinceStyling

답변

1

여기서 중요한 것은 다음입니다 ... :(이해하지 않습니다.

Transfer-Encoding : 
chunked 

청크 분할 전송 인코딩이 here을 설명 간단히 말해서

를 청크 분할 전송 인코딩 허용 서버는 보내기 전에 콘텐츠의 크기를 먼저 결정할 필요없이 대량의 콘텐츠를 청크 시퀀스로 전송하므로 서버는 클라이언트로 전송하기 위해 저장소에서 콘텐츠를로드하는 방법에 대해 훨씬 효율적으로 서버를 관리 할 수 ​​있습니다.

나는 당신이 클라이언트와 이야기하고 서버가 응답 헤더에 유효하고 정확한 Content-Length를 제공하면 진행률 보고서를 제공 할 수 있다고 말하면 좋겠다고 생각하지만 그렇지 않은 경우 사용자에게 전달할 수는 없습니다. 또는 콘텐츠 (콘텐츠 크기 포함)에 대한 정보를 얻고 콘텐츠 자체에 대한 두 번째 요청을하기 위해 초기 요청을 할 수 있습니까? 그렇다면 진행 보고서를 제공 할 수 있습니다.

+0

getContentLength는 크기에 대한 나의 초기 요청입니다. 다른 방법이 있습니까? 또는 파일의 크기를 다시 전송하는 별도의 서버 끝점을 의미합니까? – pixelearth

+0

정확하게. 데이터를 요청하고 수신하는 HTTP 트랜잭션에 Content Length가 없으면 크기와 같은 내용에 대한 정보를 얻을 수있는 별도의 GET 요청이있을 수 있습니다.이것이 실패하면 진행률 표시 줄 (또는 진행 상황을 표시하는 데 사용중인 내용)과 불확정성 표시 줄을 만들어야합니다. –

0

이전 게시물이지만 Mark의 설명은 저의 해결책을 알려줍니다.


다음 호출을 사용하여 url을 호출하십시오. 이렇게하면 서버를 "청크"모드로 전환하지 않고 콘텐츠 길이를 반환 할 수 있습니다.

DefaultHttpClient client = new DefaultHttpClient(); 
HttpGet httpGet = new HttpGet(url); 
HttpResponse execute = client.execute(httpGet); 
int contentLength = (int)execute.getEntity().getContentLength(); 

당신은 다음의 URLConnection를 사용하여 요청을 리메이크하고 사용할 수있는 이미 계산

의 콘텐츠 길이를 반환