Http文件下载的普通模式就不多说了,断点下载与普通模式不一样的是,断点下载的头信息里面增加了一个属性

?

1

RANGE: bytes=100000-

这里RANGE代表客户端要从那个位置开始下载

而服务器返回时和普通模式不同的是:
1:多了一个属性

1

Content-Range=bytes 100000-19999/20000

注意还有一些属性要设置,和普通模式一样,例如Content-Length属性
2:返回码为206

然后我们来看一段实际应用中的断点下载代码,注意这里我使用的是SpringMVC模式开发的:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

@SuppressWarnings({ "unchecked" })

@RequestMapping(value = "/downOdex.do")

public ResponseEntity<String> downFile(

  @RequestParam(value="odexName")String odexName,

  HttpServletResponse response,

  HttpServletRequest request){

 InputStream inputStream = null;

 ServletOutputStream out = null;

    try {

        File file = new File(OdexManage.odexFileBasePath + "\\" + odexName);

        int fSize = Integer.parseInt(String.valueOf(file.length()));  

        response.setCharacterEncoding("utf-8");

        response.setContentType("application/x-download");  

        response.setHeader("Accept-Ranges""bytes");  

        response.setHeader("Content-Length", String.valueOf(fSize));  

        response.setHeader("Content-Disposition""attachment;fileName=" + odexName);

        inputStream=new FileInputStream(OdexManage.odexFileBasePath + "\\" + odexName);

        long pos = 0;  

        if (null != request.getHeader("Range")) {

            // 断点续传

            response.setStatus(HttpServletResponse.SC_PARTIAL_CONTENT);  

            try {  

                pos = Long.parseLong(request.getHeader("Range").replaceAll(

"bytes=""").replaceAll("-"""));  

            catch (NumberFormatException e) {

                pos = 0;  

            }  

        }  

        out = response.getOutputStream();  

        String contentRange = new StringBuffer("bytes ").append(pos+"").append(

"-").append((fSize - 1)+"").append("/").append(fSize+"").toString();

        response.setHeader("Content-Range", contentRange);  

        inputStream.skip(pos);  

        byte[] buffer = new byte[1024*10];

        int length = 0;  

        while ((length = inputStream.read(buffer, 0, buffer.length)) != -1) {  

            out.write(buffer, 0, length);

            Thread.sleep(100);

        }

    catch (Exception e) {

  logger.error("ODEX软件下载异常:"+e);

 }finally{

         try {

          if(null != out) out.flush();

          if(null != out) out.close();

          if(null != inputStream) inputStream.close(); 

  catch (IOException e) {

  }

 }

    return new ResponseEntity(null,HttpStatus.OK);

}

其重点在于HTTP协议里面属性有一些不同的地方,还有就是InputStream跳过不需要读的文件,和注意关闭流。
通过核心代码也可以看到,其实这和是不是SpringMVC没多大关系,所以你可以很容易的应用到你的项目中。

例如对于这段代码,我访问如下路径

http://localhost/downOdex.do?odexName=D03BFBAE35BEC791092E52EC907D1F69.ZIP

使用浏览器自带的下载工具进行下载,这样可以控制下载和暂停,来观察断点下载的过程。

点击暂停会看到下载暂停下来

可以选择继续下载。

过程中你会看到,客户端不会马上把文件下载下来,而是慢慢下载,就是因为我在程序中增加了停顿来查看这个下载过程

1

Thread.sleep(100);

然后我们的缓冲区是

1

byte[] buffer = new byte[1024*10];

所以,每秒的速度就是100KB理论速度,因为是本地,所以接近100KB每秒

Http断点下载实简单讲解相关推荐

  1. Java使用HttpUrlConnection实现多线程断点下载

    相信很多同学在面试的时候,经常会被面试官问到这么一个问题:请问如何实现断点下载,即在文件未下载完成时,保存进度,在下次继续下载.要实现这个功能其实并不难,只要使用一个临时文件记录当前的下载进度,然后在 ...

  2. 21_RS485简单讲解

    资料下载 coding无法使用浏览器打开,必须用git工具下载: git clone https://e.coding.net/weidongshan/linux/doc_and_source_for ...

  3. RCNN算法思想简单讲解概述————(究极简单的讲述和理解)

           学习的过程中发现一个问题,如果不能大概的了解一下一个算法的思想直接去看他的论文,或者去看他算法的讲解就很痛苦,看不懂,学的效率也非常低,类似我之前发的RCNN论文精度的博客.RCNN目标 ...

  4. android 断点下载的实现,Android实现断点下载的方法

    最近做的项目中需要实现断点下载,即用户一次下载可以分多次进行,下载过程可以中断,在目前大多数的带离线缓存的软件都是需要实现这一功能.本文阐述了通过sqlite3简单实现了一个具有断点下载功能的demo ...

  5. 打印 上一主题 下一主题 简单讲解UEFI及MBR,及UEFI系统安装引导修复

    http://bbs.sysceo.com/forum.php?mod=viewthread&tid=14225&extra= 简单讲解UEFI及MBR MBR用于win平台 GPT主 ...

  6. 树莓派4B系统搭建(实操讲解巨细版)

    一.搭建准备 树莓派介绍:         Raspberry Pi(中文名为"树莓派",简写为RPi 是为学生计算机编程教育而设计,只有信用卡大小的微型电脑,其系统基于Linux ...

  7. Xcode安装特定版本系统的模拟器(不支持断点下载所以总是下载失败)

    Xcode里下载太慢就算了,他不支持断点下载,一直一直一直下载失败,根本就装不上嘛!!! 添加模拟器.下载需要的iOS版本 添加模拟器 没有要的iOS版本则点击Download more 然而因为Xc ...

  8. linux nas解决方案_畅快玩转NAS 篇一:Linux权限简单讲解

    畅快玩转NAS 篇一:Linux权限简单讲解 2020-01-22 19:02:28 35点赞 189收藏 8评论 你是AMD Yes党?还是intel和NVIDIA的忠实簇拥呢?最新一届#装机大师赛 ...

  9. ruby安装顺序简单讲解

    ruby安装顺序简单讲解 --孙琨SealSun 上述软件,安装环境皆为windows 64位下,适合像我一样懒得装Linux的同学.以下为安装顺序 一.安装Ruby 搜索rubyinstaller- ...

  10. ST-LINK v2下载器简单使用

    ST LINK v2下载器简单使用过程 文章目录 ST LINK v2下载器简单使用过程 前言 1.驱动安装 1.1 驱动安装常规步骤 1.2 驱动失败解决方法 2.代码下载&调试 2.1 代 ...

最新文章

  1. ICMP隧道工具ptunnel
  2. couchdb 任意命令执行漏洞(cve-2017-12636)
  3. 3000 字说说跨域!面试官听完之后露出了满意的笑容
  4. JimuReport积木报表1.3.3 版本发布,可视化报表工具
  5. pandas打印某一列_2. Python--pandas库
  6. c函数strstr和sscanf组合高级技巧
  7. windows NFS 配置
  8. 指针写字符比较c语言,利用指针进行字符串大小比较出现的问题
  9. swift拖放的按钮如何在后台设置点击事件 www.cnblogs.com/foxting/p/SWIFT.html
  10. 路由器刷php,【图片】【经验分享】路由器刷DDWRT认证锐捷校园网全程实录【哈尔滨工业大学吧】_百度贴吧...
  11. 2022春季苹果发布会将会发布什么?
  12. 硬件蓝牙测试软件,【原创】聊聊蓝牙测试专用硬件工具-Ubertooth
  13. h5阿里云播放器 常规使用
  14. 大数据Hive 面试以及知识点
  15. GBase 8s 块(chunk)
  16. 易数云数据抓取词云图制作
  17. 云笔记有哪些好用的功能,这4款云笔记一定要试试
  18. Micrel的1588方案
  19. 压缩机振动探头本特利330904-06-14-05-02-00
  20. android 手机号码隐藏其中4位

热门文章

  1. 网易云系列爬虫-采集歌单内歌曲热评
  2. PAT乙级刷题感想及踩坑总结
  3. GD32 笔记 01:如何用 Keil 新建 GD32E230 工程
  4. 服务器系统2008 64,服务器主机server 2008 R2 操作系统漏洞
  5. 烽火HG680-R-MSO9280-河南电信_湖北联通免费刷机固件及说明
  6. 软件测试周刊(第31期):所有的伟大 都源于一个勇敢的开始
  7. 杨永强“兑”现承诺 乐视云发力VaaS
  8. CodeBlocks下载安装与SDL下载使用配置教程
  9. FLAG_ACTIVITY_CLEAR_TOP和singleTask的区别
  10. Java数组排序的方法