HttpURLConnection getContentLength();返回时-1或者是0
出现问题:当getContentLength();返回时-1或者是0时候。
解决办法:需加上conn.setRequestProperty("Accept-Encoding", "identity");
解释:在默认情况下,HttpURLConnection 使用 gzip方式获取,文件 getContentLength()这个方法,每次read完成后可以获得,当前已经传送了多少数据,而不能用这个方法获取 需要传送多少字节的内容,当read() 返回 -1时,读取完成,由于这个压缩后的总长度我无法获取,那么进度条就没法计算值了。所以要取得长度则,要求http请求不要gzip压缩
附上一段代码:
1 // 临时文件检验, 是否续传文件 2 filePath = filePath + ".temp"; 3 long haveDownLength = 0; 4 File tempFile = new File(filePath); 5 if (tempFile.exists()) 6 haveDownLength = tempFile.length(); 7 8 conn = (HttpURLConnection) new URL(urlString).openConnection(); 9 if (haveDownLength > 0) 10 conn.setRequestProperty("Connection", "Keep-Alive"); 11 conn.setReadTimeout(6000); 12 conn.setConnectTimeout(3000);; 13 conn.setRequestMethod("GET"); 14 conn.setRequestProperty("Accept-Encoding", "identity"); 15 conn.connect(); 16 17 int fileSize = conn.getContentLength(); 18 long countRead = haveDownLength; 19 if (conn.getResponseCode() == 200) { 20 InputStream stream = conn.getInputStream(); 21 FileOutputStream fos = new FileOutputStream(filePath, haveDownLength > 0 ? true : false); 22 int read = 0; 23 24 byte buffer[] = new byte[1024]; 25 while ((read = stream.read(buffer)) >= 0) { 26 countRead += read; 27 fos.write(buffer, 0, (int) read); 28 } 29 fos.flush(); 30 stream.close(); 31 fos.close(); 32 } else { 33 fileSize = (int) haveDownLength; 34 } 35 conn.disconnect(); 36 37 int index = filePath.indexOf(".temp"); 38 if (index >= 1) { 39 String tempFilePath = filePath.substring(0, index); 40 File renameFile = new File(filePath); 41 File toFile = new File(tempFilePath); 42 renameFile.renameTo(toFile); 43 44 String md5 = ControlDataSourceGlobalUtil.md5sum(tempFilePath); 45 // MD5校验是否文件相同 46 if (md5.compareToIgnoreCase(fileCrc32) != 0){ 47 File tempFilePathFile = new File(tempFilePath); 48 tempFilePathFile.delete(); 49 return false; 50 } 51 return true; 52 } 53 } catch (IOException e) { 54 return false; 55 }