文件小的时候,客户端和服务端之间的文件传输。很难感知出问题来。如果文件比较大了,不管是从服务器下载文件还是往服务器上传文件都是一个问题。这里插入一个分治思维、大文件的上传和下载能很好的体现该思维。如果一个问题比较难,我们可以不断的拆解成很多个子问题,不断拆开直到我们能解子问题。当我们把多个子问题解决完的时候,距离目标已经很近了。(拆分和聚合)
1、大文件不能直接读入内存 当文件比内存还大的时候,把大文件一次性读入内存。自己想想后果。开发语言都支持读取文件流的方式,一点点的读。
2、大文件的上传
client(APP、Web)->server 大文件大小为M,在client端需要做的就是把大文件拆分为多个小块,每个小块大小为N。拆分的个数为=ceil(M / N)。拆分的过程完全由客户端控制,比如客户端在读文件流的时候,是可以控制读到大小为N的时候生成一个子文件,并且命名。可以是边拆边上传小文件,也可以是拆完后并行上传小文件。最终把按照顺序排好的ceil(M / N)个小文件名字告知服务器。让服务器那边做合并重组。像7牛的文件上传SDK,具体没有看源码。思路应该是差不多的。
2-1、文件上传失败怎么办 看失败是哪方,一般是客户端重新上传,覆盖服务端的。客户端把小文件的MD5SUM值传上去。让服务端做文件完整性校验。如果上传的文件不完整,服务端可以在次像客户端索要重新上传。
3、大文件的下载
client(APP、Web)<-server HTTP1.1开始,支持header头中带上range,指明请求文件的大小。即可以实现客户端串行去下载多个小文件。最终做合并重组。这样就能实现快速的下载大文件、断点续传了。
3-1、服务端不支持断点续传怎么办 参照HTTP1.1开始的range,我们可以自己实现一个类型的协议出来。客户端和服务端都支持按照约定来走,从而实现断点续传。