跳到主要内容

断点续传

断点续传是一种网络传输技术,用于实现文件的部分下载或上传,以便在连接断开或其他故障发生时,能从中断的位置继续进行,而不是重新开始。这在传输大文件或在网络环境不稳定的情况下特别有用。

常用的断点续传技术:

HTTP Range 请求:HTTP/1.1 协议支持 Range 头,用于请求文件的某个范围。服务端也会返回相应的范围数据,并使用 206 Partial Content 状态码作为响应。

分块下载:将文件分成多个小块,每个小块都可以独立下载。如果某个块下载失败,只需重新下载该块。

P2P 传输:在 Peer-to-Peer 网络中,同一个文件可能存在于多个节点上。断点续传可以通过从不同节点下载不同的文件块来实现。

FTP 协议:FTP(文件传输协议)也支持断点续传,通常通过 REST 命令来设置开始传输的文件偏移量。

元数据记录:通过记录已经成功下载或上传的数据块的信息,可以在程序或系统重启后,准确地从上次成功的地方继续。

QA

问题1

断点续传如何实现?

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

  1. 前端对文件分块
  2. 前端使用多线程一块一块上传,上传前给服务端发个消息校验该分块是否上传,如果已经上传则不再上传
  3. 等所有分块上传完毕,服务端合并所有分块,校验分块完整性。
    备注

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

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

问题2

分块文件清理问题?

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

  1. 在数据库中有一张文件表记录minio中存储的文件信息。
  2. 文件开始上传时会写入文件表,状态为上传中,上传完成会更新状态为上传完成。
  3. 当一个文件传了一半不再上传了说明该文件没有上传完成,会有定时任务去查询文件表中的记录,如果文件未上传完成则前除minio中没有上传成功的文件目录。

示例代码

分开上传示例代码