为什么?

对于后端来说,如果文件上传的时候采用一整个上传的方式,那么后端需要在内存中留出很大一部分空间来进行一个中转。如果文件过大,那么可能会造成内存空间的拥挤,频繁的IO造成服务器性能的下降,在web这个多并发的情况下,性能的下降会导致响应时间的增加,验证甚至会导致服务的崩溃。所以我们要对大文件的上传进行专门的优化

同时,过大的文件传输也会长时间的占用网络信道,会导致网络的拥塞,其余的服务响应时间也会增加

怎么做?

我们和前端约定,在上传文件的时候,将文件切片处理,传输的时候附带有文件的唯一标识,以及文件切片数,切片标识。

在后端时,我们创建临时文件夹来存储临时切片,在前端传入的标识和切片总数达标的时候,开始在后端合并文件成整个文件,并删除临时文件夹。

确定切片大小

根据具体情况,所以前端分片之前最好能够做一个预估,如果切片过小会导致后端频繁的访问文件,造成性能上的损耗,如果分片过大又会起不到我们预期的效果。

优化

确保文件的完整性

原因:网络原因造成的文件损耗

前后端约定使用相同的加密算法,对分片的文件计算一个MD5值,前端传输增加MD5值,后端拿到文件之后也进行相同的计算,然后对比是否一致

断点续传

一般,我们在浏览器上下载文件的时候都是支持暂停,或者重启后继续下载的。
我们只用在保存文件的时候,保存一个记录文件下载到哪一步的文件,在下载之前check一下获取进度就能实现了,然后直接从对应进度开始传输就好了。

秒传

大家可能有这样的经历,在第一次转发视频的时候要转发很久,但是在二次转发的时候就是妙传的。这是因为做了一个小的检查。一般来说,我们可以认为相同文件的MD5值是一样的,在上传之前,我们可以先做一个整文件的MD5值校验,如果已有的话就可以直接返回结果。

当然也有不同文件相同MD5值的情况,这个时候就需要再hash之类的手段了