当前位置: 首页 > news >正文

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             }

 

转载于:https://www.cnblogs.com/momoshengxiao/p/6422070.html

相关文章:

  • 编辑器
  • SUSE Linux 11架设Apache虚拟主机
  • PCL点云库在VS2010下的编译环境配置
  • MapReduce机制
  • json反序列化成实体存入数据库
  • C/C++自实现的函数(memset, memcpy, atoi)
  • yii2之创建管理员
  • 使用Hive Rest API 连接HDInsight
  • oracle 批量改temp/data/redo file的路径
  • MAPZONE GIS SDK接入Openlayers3之三——瓦片数据集接入
  • php学习1
  • 机器学习之线性回归---logistic回归---softmax回归
  • php导出pdf
  • 10第十一天JDBC事务控制管理
  • 预处理指令
  • 【comparator, comparable】小总结
  • 【跃迁之路】【669天】程序员高效学习方法论探索系列(实验阶段426-2018.12.13)...
  • 10个最佳ES6特性 ES7与ES8的特性
  • java第三方包学习之lombok
  • JS函数式编程 数组部分风格 ES6版
  • React-redux的原理以及使用
  • 前端存储 - localStorage
  • 前端面试之闭包
  • 携程小程序初体验
  • 用jquery写贪吃蛇
  • 原生js练习题---第五课
  • Linux权限管理(week1_day5)--技术流ken
  • ​ 全球云科技基础设施:亚马逊云科技的海外服务器网络如何演进
  • ​插件化DPI在商用WIFI中的价值
  • ​学习一下,什么是预包装食品?​
  • ()、[]、{}、(())、[[]]等各种括号的使用
  • (1)(1.13) SiK无线电高级配置(六)
  • (4)事件处理——(2)在页面加载的时候执行任务(Performing tasks on page load)...
  • (分布式缓存)Redis持久化
  • (附源码)springboot掌上博客系统 毕业设计063131
  • (附源码)ssm考生评分系统 毕业设计 071114
  • (考研湖科大教书匠计算机网络)第一章概述-第五节1:计算机网络体系结构之分层思想和举例
  • (淘宝无限适配)手机端rem布局详解(转载非原创)
  • (转)AS3正则:元子符,元序列,标志,数量表达符
  • * CIL library *(* CIL module *) : error LNK2005: _DllMain@12 already defined in mfcs120u.lib(dllmodu
  • ****** 二十三 ******、软设笔记【数据库】-数据操作-常用关系操作、关系运算
  • .aanva
  • .net core webapi 部署iis_一键部署VS插件:让.NET开发者更幸福
  • .Net Core缓存组件(MemoryCache)源码解析
  • .Net Core与存储过程(一)
  • .NET Framework 和 .NET Core 在默认情况下垃圾回收(GC)机制的不同(局部变量部分)
  • .Net Remoting常用部署结构
  • .NET/C# 阻止屏幕关闭,阻止系统进入睡眠状态
  • .NET处理HTTP请求
  • .NET构架之我见
  • .NET开源的一个小而快并且功能强大的 Windows 动态桌面软件 - DreamScene2
  • @Autowired自动装配
  • @ModelAttribute 注解
  • [20171102]视图v$session中process字段含义
  • [android] 切换界面的通用处理