Skip to content

大文件怎么做断点续传? ​

把文件切成块,每一块单独上传,服务器按文件标识和块序号保存。中断之后先问服务器哪些块已经有了,再传缺的那些。全部到齐后再在服务器上合并,并且校验整文件的哈希。

原理 ​

浏览器用 File.slice 按固定大小切割。每块请求带上文件 id、序号和这块的哈希。并发上传要限制数量,失败的块单独重试,不要从头再来。

续传接口返回已完成的序号或一张位图。客户端跳过这些块。标识文件用内容哈希,同一个人重复选同一个文件才能对上;只有文件名会对不上内容。

合并是服务器的事。合并前检查块是否齐全、每块哈希是否匹配,再按序号拼接,最后比对整文件哈希。客户端说「我传完了」不能直接信。

小程序和部分环境没有完整的 File API,要用它们的文件系统读一段、传一段,原理仍是序号加校验。

进度按已确认的字节计算,不要按发出去但还没成功的请求计算。暂停就是停止发新块并取消进行中的请求。

追问 ​

和分片秒传呢?

秒传是服务器已经有同一份哈希的文件,客户端不再传块。这要在传之前先问。秒传仍然要做权限,不能因为哈希相同就把别人的私有文件指给当前用户。

块太大或太小?

太大,失败一次重传成本高。太小,请求数和校验开销高。常见是几兆一块,再按网络情况调整。面试里给出取舍即可。

易错点 ​

  • 只用本地 localStorage 记录进度,换设备或清缓存就对不上服务器。
  • 合并时不校验序号,缺块也拼出文件。
  • 并发不加限制,浏览器把连接占满,页面上别的请求排不上。

相关 ​