一、断点续传是什么6 Y+ ]$ t* X1 J: H: y V9 s$ D& H
不管怎样简单的需求,在量级达到一定层次时,都会变得异常复杂。文件上传简单,文件变大就复杂,上传大文件时,以下几个变量会影响我们的用户体验:; [) E: J" N2 E4 E
服务器处理数据的能力
请求超时
网络波动 2 t- T$ v# I E3 K) C
上传时间会变长,高频次文件上传失败,失败后又需要重新上传等等。为了解决上述问题,我们需要对大文件上传单独处理,这里涉及到分片上传及断点续传两个概念。 ; [& l& \7 O. J1、分片上传3 g, g! m2 q1 x7 V/ P1 h! q* t
分片上传,就是将所要上传的文件,按照一定的大小,将整个文件分隔成多个数据块(Part)来进行分片上传。如下图: " Y' R# i+ }& L" C: w. o2 b * X, ]# U- L2 A# ?8 \: ?' M 上传完之后再由服务端对所有上传的文件进行汇总整合成原始的文件* L$ y: c' \5 ?3 b9 {3 C- z# @
大致流程如下: ; w6 [6 E; l- l* V8 D7 F
将需要上传的文件按照一定的分割规则,分割成相同大小的数据块;
初始化一个分片上传任务,返回本次分片上传唯一标识;
按照一定的策略(串行或并行)发送各个分片数据块;
发送完成后,服务端根据判断数据上传是否完整,如果完整,则进行数据块合成得到原始文件+ p9 O4 y, _+ c& l( O1 t2 @
2、断点续传$ e( d0 ?# ] Y
断点续传指的是在下载或上传时,将下载或上传任务人为的划分为几个部分,每一个部分采用一个线程进行上传或下载,如果碰到网络故障,可以从已经上传或下载的部分开始继续上传下载未完成的部分,而没有必要从头开始上传下载。用户可以节省时间,提高速度。 9 I7 t' d. O7 N' W. m: ] 一般实现方式有两种:$ N1 w" R5 ~( ~3 c) \$ |# J3 S+ W
服务器端返回,告知从哪开始
浏览器端自行处理5 C3 S: i. ]8 O+ _0 {0 A5 G
上传过程中将文件在服务器写为临时文件,等全部写完了(文件上传完),将此临时文件重命名为正式文件即可,如果中途上传中断过,下次上传的时候根据当前临时文件大小,作为在客户端读取文件的偏移量,从此位置继续读取文件数据块,上传到服务器从此偏移量继续写入文件即可。 ; w3 R8 C$ M. ~6 A; S" ^二、实现思路 5 D, k' {, J: r. o6 ` x8 E 整体思路比较简单,拿到文件,保存文件唯一性标识,切割文件,分段上传,每次上传一段,根据唯一性标识判断文件上传进度,直到文件的全部片段上传完毕。6 V2 R" M" z8 O: J2 c
D j- _" }5 F& L6 U( i
下面的内容都是伪代码。 ; j" M& O$ I2 f5 j0 u& y+ ^# `+ V 读取文件内容:: P2 Y5 O- \3 }8 Y1 m ^
有了切割上传后,也就有了文件唯一标识信息,断点续传变成了后台的一个小小的逻辑判断。后端主要做的内容为:根据前端传给后台的md5值,到服务器磁盘查找是否有之前未完成的文件合并信息(也就是未完成的半成品文件切片),取到之后根据上传切片的数量,返回数据告诉前端开始从第几节上传,如果想要暂停切片的上传,可以使用XMLHttpRequest的 abort方法。8 ^( o% y; A# l+ V m, h$ f 三、使用场景; n; b! X5 ?/ i) F$ @( f