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