HttpURLConnection getContentLength值为-1
一个android项目有一个点击更新可以下载更新apk,在更新时需要显示一个进度,这里用:
URL url = new URL(downLoadPath);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setConnectTimeout(8 * 1000);
conn.setReadTimeout(8 * 1000);
conn.connect();
long length = conn.getContentLength();
这样取得文件的总长度,结果发现conn.getConentLength()取到的值 为-1,查了一下有说设置 conn.setRequestProperty(“Accept-Encoding”, “identity”); 就可 了正常获取长度了,添加后值还是-1。
于是把downLoadPath,下载地址放在浏览器上下载可以成功下展,看他NetWork:
这图是我修改后的,修改前发现response里并没有content_lenght这个头信息,所以获取一直就是-1,然后去修改服务端,加上这个值:
resp.setHeader(“Content-Length”, String.valueOf(new FileInputStream(file).available()));
加上后便如上图所示可以发现头信息里有了contentLength这个值,然后客户端就可以成功获取了,下面展示一下详细代码
服务端
private void fileLoad(HttpServletRequest req, HttpServletResponse resp) throws IOException {
String param = req.getParameter("param") == null ? "" : req.getParameter("param");
String callback = req.getParameter("callback") == null ? "" : req.getParameter("callback");
String filename = req.getParameter("filename") == null ? "" : req.getParameter("filename");
String tv = req.getParameter("tv") == null ? "" : req.getParameter("tv");
JSONObject obj = new JSONObject();
int recode = 0;
String text = "";
ServletOutputStream out = null;
if (!filename.equals("")) {
try {
resp.setContentType("application/force-download");
resp.setCharacterEncoding("utf-8");
File file = null;
if ("008".equals(tv)) {
file = new File(MyIP.tv8_apk_download_url + filename);
} else if ("009".equals(tv)) {
file = new File(MyIP.tv9_apk_download_url + filename);
}
resp.setHeader("Content-Disposition", "attachment;filename=" + new String(filename.getBytes()));
resp.setHeader("Content-Length", String.valueOf(new FileInputStream(file).available()));
out = resp.getOutputStream();
InputStream bis = null;
BufferedOutputStream bos = null;
try {
bis = new FileInputStream(file);
bos = new BufferedOutputStream(out);
byte[] buff = new byte['?'];
int bytesRead;
int k = 0;
while (-1 != (bytesRead = bis.read(buff, 0, buff.length))) {
k+=1;
bos.write(buff, 0, bytesRead);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (bis != null)
bis.close();
if (bos != null) {
bos.close();
}
}
} catch (NumberFormatException e) {
recode = 1;
text = "参数格式错误";
e.printStackTrace();
} catch (Exception e) {
recode = 99;
text = "系统异常";
e.printStackTrace();
OutputMethod.ExceptionControl(e, parameter);
}
} else {
recode = 1;
text = "缺少参数";
}
obj.put("recode", Integer.valueOf(recode));
obj.put("text", text);
System.out.println("####fileLoad:"+obj.toString());
out.print(callback + "(" + obj.toString() + ")");
out.close();
}
客户端
private class downloadApkThread extends Thread {
@Override
public void run() {
try {
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
System.out.println("App的下载路径为:" + downLoadPath);
URL url = new URL(downLoadPath);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setRequestProperty("Accept-Encoding", "identity");
conn.setRequestProperty("User-Agent", " Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.120 Safari/537.36");
conn.setConnectTimeout(8 * 1000);
conn.setReadTimeout(8 * 1000);
conn.connect();
long length = conn.getContentLength();
if(length < 0){
String values = conn.getHeaderField("Content-Length");
if (values != null && !values.isEmpty()) {
length = Long.parseLong(values);
}
}
InputStream is = conn.getInputStream();
System.out.println("#######conn.getContentLength:"+length);
//获取App文件名
apkName = downLoadPath.substring(downLoadPath.lastIndexOf("=") + 1, downLoadPath.length());
System.out.println("####apkName:"+apkName);
//下载后保存的路径
saveFileDir = Environment.getExternalStorageDirectory() + "/APP";
File apkFileDir = new File(saveFileDir);
if (!apkFileDir.exists()) {
//如果/App文件夹不存在就创建一个新的App子文件夹
apkFileDir.mkdir();
}
File apkFile = new File(apkFileDir, apkName);
FileOutputStream fos = new FileOutputStream(apkFile);
int count = 0;
byte buf[] = new byte[10 * 1024];
do {
int numread = is.read(buf);
count += numread;
progress = (int) (((float) count / length) * 100);
//System.out.println("#####load progress:" + progress);
updateProgress.setProgress(progress);
if (numread <= 0) {
installAPk(apkFile);
break;
}
fos.write(buf, 0, numread);
} while (true);
fos.close();
is.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
;