断点续传实现

断点续传技术解析与应用 断点续传是一种在数据传输中断后,能够从中断位置继续传输的技术。断点续传技术通过记录已传输的部分和未传输的部分,允许数据传输在中断后从最后一个成功的点继续进行,从而提高了数据传输的效率和可靠性。而断点续传可以从中断的位置继续传输,避免重新传输整个文件,提高了传输大文件的效率和可行性。通过记录传输进度和恢复机制,断点续传技术可以在网络不稳定或系统故障的情况下,确保数据的完整传输,提高传输的可靠性。对于大文件下载或上传,断点续传可以在网络中断后恢复传输,减少用户的等待时间和不必要的重新操作,提高用户体验。 阅读详情

断点续传

1、 什么是断点续传

通常视频文件都比较大,所以对于媒资系统上传文件的需求要满足大文件的上传要求。http协议本身对上传文件大小没有限制,但是客户的网络环境质量、电脑硬件环境等参差不齐,如果一个大文件快上传完了网断了没有上传完成,需要客户重新上传,用户体验非常差,所以对于大文件上传的要求最基本的是断点续传。

什么是断点续传:

        引用百度百科:断点续传指的是在下载或上传时,将下载或上传任务(一个文件或一个压缩包)人为的划分为几个部分,每一个部分采用一个线程进行上传或下载,如果碰到网络故障,可以从已经上传或下载的部分开始继续上传下载未完成的部分,而没有必要从头开始上传下载,断点续传可以提高节省操作时间,提高用户体验性。

断点续传流程如下图:

流程如下:

1、前端上传前先把文件分成块

2、一块一块的上传,上传中断后重新上传,已上传的分块则不用再上传

3、各分块上传完成最后在服务端合并文件

2、断点续传实现

1.前端对文件进行分块

2.前端使用多线程上传分片,上传前给服务器发送消息验证当前分片是否已经上传。

3.所有分片上传完毕后,发送合并分片请求,校验文件的完整性。 (上传的分片应该具备顺序标记)

4.前端给服务器传一个MD5值,服务器合并文件后,利用MD5值计算是否与源文件一致。如果不一致,说明文件需要重新上传。

分片文件清理问题:

  • 在数据库中有一张文件表记录minIo中存储的文件信息
  • 文件开始上传时会写入文件表,状态为上传中,上传完成会更新状态为上传完成
  • 当一个文件传了一半不再上传了,说明该文件没有上传完成,通过定时任务去查询文件表中的记录,如果文件距离上次上传结束超过24小时,则可以考虑清除MinIo中相关的分片数据

3、断点续传是怎么做的?


我们是基于分块上传的模式实现断点续传的需求,当文件. 上传-部分断网后前边已经上传过的不再上传。

1、前端对文件分块。

2、前端使用多线程-块一块上传,上传前给服务端发-个消息校验该分块是否.上传,如果已上传则不再上传。

3、等所有分块上传完毕,服务端合并所有分块,校验文件的完整性。

因为分块全部上传到了服务器,服务器将所有分块按顺序进行合并,就是写每个分块文件内容按顺序依次写入一个文件中。使用字节流去读写文件。

4、前端给服务传了一个md5值,服务端合并文件后计算合并后文件的md5是否和前端传的一样,如果一样则说文件完整,如果不一样说明可能由于网络丢包导致文件不完整,这时上传失败需要重新上传。


4、分块文件清理问题?


上传一个文件进行分块上传,上传一半不传了, 之前上传到minio的分块文件要清理吗?怎么做的?

1、在数据库中有一-张文件表记录minio中存 储的文件信息。

2、文件开始上传时会写入文件表,状态为上传中,上传完成会更新状态为 上传完成。

3、当一个文件传了一半不再上传了说明该文件没有上传完成,会有定时任务去查询文件表中的记录,如果文件未上传完成则删除minio中没有.上传成功的文件日录。

5、分块与合并测试

为了更好的理解文件分块上传的原理,下边用java代码测试文件的分块与合并。

文件分块的流程如下:

1、获取源文件长度

2、根据设定的分块文件的大小计算出块数

3、从源文件读数据依次向每一个块文件写数据。

测试代码如下:

package com.xuecheng.media;

import org.apache.commons.codec.digest.DigestUtils;
import org.junit.jupiter.api.Test;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.*;

/**
 * @program: xuecheng-plus-project148
 * @description: TODO大文件分块合并
 * @author: Mr.Zhang
 * @create: 2023-02-27 08:54
 **/
public class BigFileTest {

    //分块测试
    @Test
    public void testChunk() throws IOException {
        //源文件
        File sourceFile = new File("D:\\software\\Test\\xuecheng\\video\\1.mp4");

        //分块文件存储路径
        File chunkFolderPath = new File("D:\\software\\Test\\xuecheng\\chunk\\");
        if (!chunkFolderPath.exists()) {
            chunkFolderPath.mkdir();
        }

        //分块的大小   1mb
        int chunkSize = 1024 * 1024 * 1;

        //分块数量
        long chunkNum = (long) Math.ceil(sourceFile.length() * 1.0 / chunkSize);

        //思路,使用流对象读取文件,向分块文件写数据,达到分块大小不再写
        RandomAccessFile raf_read = new RandomAccessFile(sourceFile, "r");

        //缓冲区
        byte[] b = new byte[1024];
        for (long i = 0; i < chunkNum; i++) {
            //分块文件
            File file = new File("D:\\software\\Test\\xuecheng\\chunk\\" + i);
            //如果分块文件存在了,则删除
            if (file.exists()) {
                file.delete();
            }
            //创建文件
            boolean newFile = file.createNewFile();
            if (newFile) {
                //向分块文件写数据流对象
                RandomAccessFile raf_write = new RandomAccessFile(file, "rw");
                int len = -1;
                while ((len = raf_read.read(b)) != -1) {
                    //向文件中写数据
                    raf_write.write(b, 0, len);
                    //达到分块大小不在写了
                    if (file.length() >= chunkSize) {
                        break;
                    }
                }
                raf_write.close();
            }
        }
        raf_read.close();
    }

    //测试合并
    @Test
    public void testMerge() throws IOException {
        //源文件
        File sourceFile = new File("D:\\software\\Test\\xuecheng\\video\\1.mp4");

        //分块文件存储路径
        File chunkFolderPath = new File("D:\\software\\Test\\xuecheng\\chunk\\");
        if (!chunkFolderPath.exists()) {
            chunkFolderPath.mkdir();
        }

        //合并后的文件
        File mergeFile = new File("D:\\software\\Test\\xuecheng\\video\\1_01.mp4");
        boolean newFile1 = mergeFile.createNewFile();

        //思路,使用流对象读取分块文件,按顺序将分块文件依次向合并文件写数据
        //获取分块文件列表,按文件名升序排序
        File[] chunkFiles = chunkFolderPath.listFiles();
        List<File> chunkFileList = Arrays.asList(chunkFiles);
        //按文件名升序排序
        Collections.sort(chunkFileList, new Comparator<File>() {
            @Override
            public int compare(File o1, File o2) {
                return Integer.parseInt(o1.getName()) - Integer.parseInt(o2.getName());
            }
        });
        //创建合并文件的流对象
        RandomAccessFile raf_write = new RandomAccessFile(mergeFile, "rw");
        //缓冲区
        byte[] b = new byte[1024];
        for (File file : chunkFileList) {
            //读取分块文件的流对象
            RandomAccessFile raf_read = new RandomAccessFile(file, "r");
            int len = -1;
            while ((len = raf_read.read(b))!=-1){
                //向合并文件写数据
                raf_write.write(b,0,len);
            }
        }

        //校验合并后的文件是否正确
        FileInputStream sourceFileStream = new FileInputStream(sourceFile);
        FileInputStream mergeFileStream = new FileInputStream(mergeFile);
        //源文件
        String sourceMd5Hex = DigestUtils.md5Hex(sourceFileStream);
        //合并后的文件
        String mergeMd5Hex = DigestUtils.md5Hex(mergeFileStream);
        if (sourceMd5Hex.equals(mergeMd5Hex)){
            System.out.println("合并成功");
        }

    }

}
大文件上传如何做断点续传?全端+后端结合开发 断点续传(Resumable File Upload)是一种文件上传的技术,它允许在上传过程中出现中断或失败的情况下,能够从中断的位置继续上传,而不需要重新上传整个文件。这在处理大文件或不稳定的网络连接时非常有用。 阅读详情

相关推荐

上传视频文件,基于断点续传(整合Minio)

传统的文件传输方式通常是一次性地将整个文件进行传输,如果在传输过程中发生中断或失败,需要重新开始传输整个文件,这可能会浪费时间和带宽资源。而通过断点续传的机制,可以在传输过程中记录下已经成功传输的部分,如果传输中断,则可以从中断的位置继续传输,节省时间和资源断点续传指的是在下载或上传时,将下载或上传任务(一个文件或一个压缩包)人为的划分为几个部分,每一个部分采用一个线程进行上传或下载。

📜一个热爱探索的人 7838

HTTP断点续传(分块传输)

简述 断点续传:指的是在上传/下载时,将任务(一个文件或压缩包)人为的划分为几个部分,每一个部分采用一个线程进行上传/下载,如果碰到网络故障,可以从已经上传/下载的部分开始继续上传/下载未完成的部分,而没有必要从头开始上传/下载。可以节省时间,提高速度。 简述 断点续传的用途 Range Content-Range 增强...

weixin_33832340的博客 4907

ISO26262 功能安全各个阶段测试要求

1. 开发过程说明 系统层面:包括软硬件集成测试、系统集成测试以及整车测试。 硬件层面:包括硬件集成与测试。 软件层面:单元测试、集成测试。 2. 功能安全总体要求 2.1 各项指标 2.2 诊断覆盖度举例 针对一个信号举例说明: 3. 功能安全测试要求 3.1 测试计划 核心内容应包括, 测试对象:需要测试的对象描述,以及测试的范围描...

AgingMoon的博客 1万+

SpringBoot实现断点续传

大文件面临的问题 1. 上传速度慢 -- 应对: 分块上传 2. 上传文件到一半中断后,继续上传却只能重头开始上传 -- 应对: 断点续传 3. 相同文件未修改再次上传, 却只能重头开始上传 -- 应对: 秒传 分片上传 1、什么分片上传 分片上传,就是将所要上传的文件,按照一定的大小,将整个文件分隔成多个数据块(我们称之为Part)来进行分别上传,上传完之后再由服务端对所有上传的文件进行汇总整合成原始的文件 2、分片上传适用场景 ...

人生就像一场戏 8107

模糊综合评价模型

一.引子 1.数学归纳法:同高中知识 2.秃子悖论:秃子悖论 这俩个例子都是类似于“量变引起质变”的道理,而在数学中我们把这类问题的性质叫做“模糊性”,在生活中我们也经常能遇到一些模糊的概念,比如年轻、帅、很少很多… 二.概述 模糊综合评价法是一种基于模糊数学的综合评价方法。该综合评价法根据模糊数学的隶属度理论把定性评价转化为定量评价,即用模糊数学对受到多种因素制约的事物或对象做出一个总体的评价。它具有结果清晰,系统性强的特点,能较好地解决模糊的、难以量化的问题,适合各种非确定性问题的解决。——来自百度百

The__Tyche的博客 2万+

在pycharm2021.2中学习opencv图像处理,基于python3.9.7、pycharm完成配置

在pycharm中学习opencv图像处理安装python下载python安装包开始安装安装pycharm社区版下载pycharm开始安装如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 安装python 使用pycharm学习opencv应该是最简单的了,对新手比较友好,

steveqobs 7707

实现断点续传

断点续传思路 1.大文件切片上传: 想要上传大文件,那么就需要将大文件进行切片,分为一块一块的小文件,将小文件分别发送给后台,后台接收道小文件后,将小文件存储起来,当所有小文件上传成功后,再将小文件合并到一个文件中,这样就完成了大文件切片上传 2.断点续传: 想要实现断点续传,那么首先实现大文件上传。当我们将文件切片,除了需要给文件对应的值(我使用md5)外,还需要给每个小文件对应的编号,将md5和编号同时传送给后端,后端根据md5和编号进行小文件存储,当发生文件上传一半终止上传后,获取后端已经上传的小文件

gao的博客 7293

静态时序分析—门控时钟检查(clock gating check)

clock gating check的条件与类型

m0_61544122的博客 9606

从断点续传的原理来实现断点续传

你是不是在因为断点续传而烦恼着呢?告诉你不用了,现在我将详细的从断点续传的原理帮你解决这个问题。 (一)断点续传的原理 其实断点续传的原理很简单,就是在Http的请求上和一般的下载有所不同而已。打个比方,浏览器请求服务器上的一个文时,所发出的请求如下: 假设服务器域名为wwww....

chukuangzhui7455的博客 793

国网DLT698.45协议——采集系统、数据交换(三)

物理层规定了通信单元或其他终端设备与多功能电表的通信接口,接口的物理与电气特性。常见的物理层传输方式有对于RS485、红外、载波通信等通信信道。将数据包装成可传输的帧格式。1、根据通信配置参数完成端口的初始化配置,通信状态初始化为准备接收状态,初始化相关计数器及缓冲区指针。2、链路层及控制子模块负责通信数据的收发控制,各类超时问题的处理。无通信数据接收时,定时初始化通信端口。3、完成协议帧的解析及应答。

一个bug是bug,多个bug能work 8050

光电二极管探测器电流信号处理与指令输出系统

本文提出了一种基于Python的光电二极管电流信号处理系统设计方案。该系统能够实时采集、处理光电二极管输出的电流信号,并根据预设阈值输出控制指令。系统采用模块化架构,包含数据采集、信号处理、阈值检测、指令生成等核心模块。其中数据采集模块提供了模拟器实现和硬件接口框架,支持噪声模拟和脉冲信号生成。系统设计考虑了实时性、可靠性和可扩展性,适用于光强测量、光电检测等多种应用场景。

huanghm88的专栏 1180

java 实现断点续传服务

java 实现断点续传服务 一:什么是断点续传 客户端软件断点续传指的是在下载或上传时,将下载或上传任务(一个文件或一个压缩包)人为的划分为几个部分,每一个部分采用一个线程进行上传或下载,如果碰到网络故障,可以从已经上传或下载的部分开始继续上传下载未完成的部分,而没有必要从头开始上传下载 (将文件分片以及后续合并是一个不小的工作量,由于项目时间有限,我并没有做分片,只是实现了可断点下载) 二:实现原理 2.1 实现思路 需要前端和后端的配合,前端在请求头中 标明 下载开始的位置,后端重标记位置开始向前端输出

qq_50990903的博客 8602

09 SAP CPI 访问公共API接口

我在网上找了一个公共API,入参输入汉字返回拼音。至此,一个真正的访问API的接口就做好了。点击保存时可看到红叉报错。

SAP CPI 477

用Java实现断点续传

(一)断点续传的原理 其实断点续传的原理很简单,就是在Http的请求上和一般的下载有所不同而已。打个比方,浏览器请求服务器上的一个文时,所发出的请求如下:假设服务器域名为wwww.sjtu.edu.cn,文件名为down.zip。GET /down.zip HTTP/1.1Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, ap

rich1979的专栏 1371

MATLAB使用贝叶斯网络bnt工具箱:使用手册详解

MATLAB使用贝叶斯bnt网络工具箱:使用手册详解

WW、forever的博客 2676

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

断点续传JAVA实现

支持H5 Video标签播放,迅雷下载 /** * 断点续传工具 * @author lxycx_xc * 时间:2017年11月30日 */ public class BreakpointResume { private static Logger log = Logger.getLogger(BreakpointResume.class); /**下载操作,支持断点...

w13707470416的博客 1727

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

RandomAccessFile实现断点续传

一丶概述断点续传是

行动者&&职业化 3349

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

断点续传的实现

1.从上次断开位置继续下载 HTTP断点续传: 实现原理: 1.客户端保存当前已下载文件的位置或大小。 2.在下次请求时告诉服务端自己请求的是哪一区间的数据。 3.服务端根据请求中的范围,从文件指定位置取出区间范围的数据进行响应。 关键问题:上次下载文件跟本次断点续传请求文件不一致(上次断开后,文件数据发生改变) 一旦上次断开后文件数据发生了改变,就算客户端请求的是区间数据,也为了防止数据不一致重新返回完整的文件数据 HTTP实现: 1.服务端对客户的请求中加: Accept-Ranges:bytes

黑桃K 2001

前段实现文件的断点续传

前段实现文件的断点续传

dyx001007的博客 1434

JAVA实现断点续传

断点续传的原理 其实断点续传的原理很简单,就是在Http的请求上和一般的下载有所不同而已。打个比方,浏览器请求服务器上的一个文时,所发出的请求如下:假设服务器域名为wwww.sjtu.edu.cn,文件名为down.zip。GET /down.zip HTTP/1.1Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, appli

Jerome Kwok网络日志 988

java 上传断点续传原理,java实现断点续传的原理

其实断点续传的原理很简单,就是在Http的请求上和一般的下载有所不同而已。打个比方,浏览器请求服务器上的一个文时,所发出的请求如下:假设服务器域名为wwww.sjtu.edu.cn,文件名为down.zip。GET /down.zip HTTP/1.1Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/v...

weixin_28756281的博客 280

如何实现文件断点续传功能

相信大家都使用过迅雷、电驴、百度云网盘等一类的工具,所有这些支持上传或下载的工具都有一个功能,那就是断点续传,也就是在你网络不佳传输断开时,传输会暂停,在网络恢复后,可以继续传输,从而避免数据的重复上传,以减少网络流量,提高效率。那么,你有仔细想过这其中的实现原理嘛? PS:这两天没更,一是研究了下这个东西,二是偷懒去嗨了 我们之前利用rpc框架thrift做了一个远程通信的项目,具体是实现通过服务器对分布在各地的设备进行统一管理和控制,设备利用4G模块上网,因此,网络状况是影响稳定性的一个重要因.

画鸡蛋的不止达芬奇 7375

web实现断点续传

普通单文件上传: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>断点续传</title> </head> <body> <div id="app"> <input type="...

duansamve的博客 1001

java断点续传原理_很简单的Java断点续传实现原理

原理解析在开发当中,“断点续传”这种功能很实用和常见,听上去也是比较有“逼格”的感觉。所以通常我们都有兴趣去研究研究这种功能是如何实现的?以Java来说,网络上也能找到不少关于实现类似功能的资料。但是呢,大多数都是举个Demo然后贴出源码,真正对其实现原理有详细的说明很少。于是我们在最初接触的时候,很可能就是直接Crtl + C/V代码,然后捣鼓捣鼓,然而最终也能把效果弄出来。但初学时这样做其实很...

weixin_31938727的博客 2123

linux断点续传程序,Linux下怎么实现断点续传

当要传送的文件较大,过程中如果网络中断了,就比较悲剧了。那么Linux下怎么实现断点续传呢?学习啦小编分享了Linux下实现断点续传的方法,希望对大家有所帮助。Linux下实现断点续传方法断点续传的原理其实断点续传的原理很简单,就是在 Http 的请求上和一般的下载有所不同而已。打个比方,浏览器请求服务器上的一个文时,所发出的请求如下:假设服务器域名为 wwww.sjtu.edu.cn,文件名为 ...

weixin_35712811的博客 2086
上一篇: Redis
下一篇: Minio服务器上传图片视频访问不了
Relievedz
博客等级 码龄5年 255粉丝 94原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值