首页 > 其他分享 >断点续传下载实现

断点续传下载实现

时间:2024-07-01 10:58:05浏览次数:17  
标签:断点续传 endByte 实现 headers file startByte 下载

说明:

在下载时,将下载任务人为的划分为几个部分,碰到网络故障断开时,可以从已经下载的部分开始继续下载未完成的部分,而没有必要从头开始下载。用户可以节省时间,提高速度。

实现方案:

 通过springboot实现断点续传

@GetMapping(value = "/downloadFile")
public ResponseEntity<Resource> downloadFile(@RequestHeader(value = "Range", required = false) String range,String filePath) {
    File file = new File(filePath);
    if (file.exists() && file.isFile()) {
        HttpHeaders headers = new HttpHeaders();
        long fileLength = file.length();

        // 处理断点续传的 Range 请求头
        if (range!= null) {
            String[] rangeValues = range.split("=")[1].split("-");
            long startByte = Long.parseLong(rangeValues[0]);
            long endByte;
            if (rangeValues.length > 1) {
                endByte = Long.parseLong(rangeValues[1]);
            } else {
                endByte = fileLength - 1;
            }

            headers.set(HttpHeaders.CONTENT_RANGE, "bytes " + startByte + "-" + endByte + "/" + fileLength);
            headers.set(HttpHeaders.CONTENT_LENGTH, String.valueOf(endByte - startByte + 1));

            try (RandomAccessFile randomAccessFile = new RandomAccessFile(file, "r")) {
                randomAccessFile.seek(startByte);
                byte[] data = new byte[(int) (endByte - startByte + 1)];
                randomAccessFile.readFully(data);
                return ResponseEntity.status(HttpStatus.PARTIAL_CONTENT)
                      .headers(headers)
                      .body(new ByteArrayResource(data));
            } catch (IOException e) {
                e.printStackTrace();
                return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build();
            }
        } else {
            headers.add(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename*=utf-8''" + URLEncoder.encode("下载.zip", "UTF-8"));
            return ResponseEntity.ok()
                  .headers(headers)
                  .contentLength(fileLength)
                  .contentType(MediaType.APPLICATION_OCTET_STREAM)
                  .body(new FileSystemResource(file));
        }
    } else {
        return ResponseEntity.notFound().build();
    }
}

如果是通过nginx代理的话,可以通过nginx配置实现断点续传

以下是实现分片下载的基本配置步骤:

  • 1. 确保你已经安装并配置好了 NGINX 服务器。
  • 2. 编辑 NGINX 配置文件:
  •    通常,NGINX 的配置文件位于 `/etc/nginx/nginx.conf` 或 `/etc/nginx/conf.d/default.conf`。打开配置文件并找到你想要启用分片下载的 `server` 或 `location` 块。
  • 3. 配置 `location` 块:
  •     在 `location` 块中,添加以下指令来启用断点续传功能:
server {
       listen 80;
       server_name your_server_name;

       location /downloads/ {
           root /path/to/your/files;
           # 允许分片下载
           aio on;
           # 允许断点续传
           output_buffers 1 512k;
           # 启用高效文件传输
           sendfile on;
           # 允许客户端指定下载范围
           tcp_nopush on;
           tcp_nodelay on;
           # 设置缓存控制头
           open_file_cache max=1000 inactive=20s;
           open_file_cache_valid 30s;
           open_file_cache_min_uses 2;
           open_file_cache_errors on;
       }
   }
  • 4. 编辑并保存配置文件后,重新加载 NGINX 配置以使更改生效
sudo nginx -s reload

前端实现:

前端发送的 Range 请求头的格式通常为 Range: bytes=startByte-endByte ,其中 startByte 表示起始字节位置,endByte 表示结束字节位置。如果只指定起始字节位置,例如 Range: bytes=500- ,表示从第 500 个字节开始到文件末尾。 

标签:断点续传,endByte,实现,headers,file,startByte,下载
From: https://blog.csdn.net/weixin_46836162/article/details/140065092

相关文章

  • 全网最适合入门的面向对象编程教程:06 类和对象的Python实现-自定义类的数据封装
    全网最适合入门的面向对象编程教程:06类和对象的Python实现-自定义类的数据封装摘要:本文我们主要介绍了数据封装的基本概念和特性,如何设置自定义类的私有属性和私有方法,protect属性的概念和特点。往期推荐:学嵌入式的你,还不会面向对象??!全网最适合入门的面向对象编程教程:00......
  • 邮件发送实现
    说明通过smtp实现邮件发送功能引入pom.xml<dependency><groupId>com.sun.mail</groupId><artifactId>javax.mail</artifactId><version>1.6.2</version></dependency>源码/***发送邮件*@paramusername发送者账号......
  • 在Linux中,如何使用xargs和exec实现把当前目录下所有后缀名为.txt的⽂件的权限修改为77
    在Linux中,要使用xargs和exec结合find命令来批量修改当前目录下所有后缀名为.txt的文件权限为777,可以按照以下步骤操作:查找.txt文件:首先,使用find命令来查找当前目录及其子目录下的所有.txt文件。这里我们使用-name"*.txt"来指定查找的文件名模式。传递给xargs:然后,通过管......
  • 搭建个人直播间,实现24小时B站、斗鱼、虎牙等无人直播!
    大家好,我是Java陈序员。不知道大家平时看不看直播呢?现在有各式各样的直播,游戏直播、户外直播、带货直播、经典电视/电影直播等等。电视、电影直播是24小时不间断无人直播,如斗鱼/虎牙中的一起看,这种直播要如何实现呢?其实非常简单,只需要一台服务器和视频资源就能完成。再借助......
  • 代码随想录算法训练营第十天|232.用栈实现队列、225.用队列实现栈、20.有效的括号、 1
    今天学习了栈与队列这两个数据结构,栈是一个先进后出的结构,在C++中用stack进行表示,有push、pop、top、empty这些属性;队列是一个先进后出的结构,有push、pop、front、back。empty这些属性。在底层实现上,他们都是用deque双向队列进行实现的。232.用栈实现队列题目链接:232.用栈......
  • 【python零基础入门到就业】002、2024最新windows环境下python的下载和安装
    文章目录1.引言2.检查是否已安装Python3.在Windows上安装Python3.1下载Python安装包3.2安装Python3.3验证安装4.结语1.引言在开始编写Python代码之前,我们首先需要在计算机上安装Python。本文将详细介绍如何在Windows系统上下载和安装Python。2......
  • Python离线下载并安装包及其依赖
    1,安装pipdeptree:PSD:\test>pipinstallpipdeptree2,假如想在内网安装flask,先在外网下载安装:PSD:\test>pipinstallflask3,使用pipdeptree查看并生成requirements.txtPSD:\test>pipdeptree-f-pflaskFlask==1.1.2click==7.1.2itsdangerous==1.1.0Jinja2==2.11.2......
  • C#winform如何在窗体实现视频播放
    1.在Form窗体设计中的左侧工具箱列表中右击鼠标,单击选择项。2.在弹出的对话框中点击COM组件,选择WindowsMediaPlayer,点击确定3.接着在工具箱选择WindowsMediaPlayer控件,将控件添加到窗体中,并且添加一个OpenFileDialog控件4.接着在工具箱的对话框中将OpenFileDialog添加......
  • 网络隔离后 用这种安全U盘可实现数据安全传输
    在网络隔离的环境下,尤其是物理隔离环境下,使用安全U盘进行数据传输可以被视为一种安全的方法。不过前提是要确保以下几点:1、来源可信性:确保U盘的来源是可信的,没有被感染或篡改过的风险。最好使用自己的U盘,或者来自于安全可靠的来源。2、扫描病毒:在使用U盘之前,应该通过安全的杀......
  • 粮仓管理系统的设计与实现boot论文
    摘 要如今社会上各行各业,都喜欢用自己行业的专属软件工作,互联网发展到这个时候,人们已经发现离不开了互联网。新技术的产生,往往能解决一些老技术的弊端问题。因为传统粮仓管理系统信息管理难度大,容错率低,管理人员处理数据费工费时,所以专门为解决这个难题开发了一个粮仓管理系......