5

내가 사용하여 URL의 내용의 크기를 얻으려고 제공 : 내가 AsyncTask 및 일부의 doInBackground() 이내에 사용하고안드로이드 : URLConnection.getContentLength() 잘못된 값

URLConnection conn = null; 
URL url = null; 
url = new URL("https://dl.dropboxusercontent.com/u/90210205/Default.html"); 
conn = url.openConnection(); 
conn.connect(); 
InputStream in = new BufferedInputStream(url.openStream()); 
int fileSize = conn.getContentLength(); 
System.out.println("File size " + fileSize); 
while (in.read() != -1) { 
    i++; 
} 
in.close(); 
System.out.println("Read " + i + " bytes of a possible " + fileSize); 

을 이유 conn.getContentLength();10136을 반환해야 할 때 1273을 반환합니다.

정규 Java 응용 프로그램의 Main 내에서 위 코드를 사용했으며 conn.getContentLength();은 올바른 10136 값을 반환합니다.

AsyncTask에서 작동하지 않습니까?

+0

서버 측에서 청크 분할 전송 인코딩을 사용하고 있습니까? – axierjhtjz

답변

1

.getContentLength()의 설명은 헤더 필드의 값을 반환한다는 것입니다. 일반적으로이 값은 읽을 수있는 데이터의 양과 일치해야합니다. 그러나 ...

(1) 청크 인코딩을 사용하여 데이터를 보내는 경우 헤더가 표시되지 않을 수 있습니다. 이 경우 .getContentLength()-1을 반환하므로 여기서는 그렇지 않습니다.

(2) 기본적으로 HttpURLConnection 구현은 서버가 gzip 압축을 사용하고 getInputStream()의 발신자에 대한 데이터의 압축을 자동으로 해제하도록 요청합니다. 이 경우 Content-Encoding 및 Content-Length 응답 헤더가 지워집니다. ...

마지막 문장은`) (.getContentLength에서 -1을받지 않기 때문에,이 또한 경우가 여기에없는 것을 나타 내기 위해서 보이지만, 상대적 크기 (10,136분의 1,273)은 나를 의심하게

"스 누프"관찰자 네트워크 트래픽 단서 데이터의 HTTP 헤더와 양 것

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

또이 중

한 테스트와 요청 헤더의 허용 가능한 인코딩을 설정하여 비활성화 gzip을 부호화하는 것 .

BTW, url.openStream()url.openConnection().getInputStream()의 편의입니다.