外观
大文件怎么做断点续传?
把文件切成块,每一块单独上传,服务器按文件标识和块序号保存。中断之后先问服务器哪些块已经有了,再传缺的那些。全部到齐后再在服务器上合并,并且校验整文件的哈希。
原理
浏览器用 File.slice 按固定大小切割。每块请求带上文件 id、序号和这块的哈希。并发上传要限制数量,失败的块单独重试,不要从头再来。
续传接口返回已完成的序号或一张位图。客户端跳过这些块。标识文件用内容哈希,同一个人重复选同一个文件才能对上;只有文件名会对不上内容。
合并是服务器的事。合并前检查块是否齐全、每块哈希是否匹配,再按序号拼接,最后比对整文件哈希。客户端说「我传完了」不能直接信。
小程序和部分环境没有完整的 File API,要用它们的文件系统读一段、传一段,原理仍是序号加校验。
进度按已确认的字节计算,不要按发出去但还没成功的请求计算。暂停就是停止发新块并取消进行中的请求。
追问
和分片秒传呢?
秒传是服务器已经有同一份哈希的文件,客户端不再传块。这要在传之前先问。秒传仍然要做权限,不能因为哈希相同就把别人的私有文件指给当前用户。
块太大或太小?
太大,失败一次重传成本高。太小,请求数和校验开销高。常见是几兆一块,再按网络情况调整。面试里给出取舍即可。
易错点
- 只用本地
localStorage记录进度,换设备或清缓存就对不上服务器。 - 合并时不校验序号,缺块也拼出文件。
- 并发不加限制,浏览器把连接占满,页面上别的请求排不上。