云盘秒传功能与断点续传功能是如何实现
概要
随着网络存储技术的逐渐成熟,相信很多人都使用过云盘来存储自己的文档,无论是办公的情况下,我们会使用云盘来共享自己的工作文档,与其他同事协同工作,在生活中,我们使用云盘来存储自己的下载的电影,心仪的歌曲,旅行的照片等等,云盘的优势就在于,只要有网络的情况下,我们可以就随时随地可以从网络中获取和上传我们所需要的东西,有了云盘,我们的办公生活越来越便捷。
有一些同学,在网上下载了一部非常好看的电影,足足有10几个G,然后他们想使用云盘来保存这部电影,在使用云盘上传电影的时候,他们惊讶的发现,怎么10几个G的电影,2秒钟的时间不到,云盘已经显示上传完毕了。好了,相信大家都在疑惑这个问题,几十G的大文件,为什么使用云盘上传的时候会一下子的上传完毕呢,不会是这些同学的家里有矿,拉了一条几十G的宽带吧?其实不是的,只是云盘只是用了一种非常简单的秒传技术,下面我们就逐一揭开云盘秒传功能神秘的面纱吧。
文件MD5
在讲云盘秒传功能之前,我们先说一下文件MD5,每个文件都有一个唯一的签名,相对于我们的身份证,我们可以通过MD5文件工具或者程序MD5算法来计算出文件的这个签名,即文件的MD5码,如果计算出来两个文件的文件MD5码是一样的,那么我们可以认为这两个文件是一样的。话不多说,下面我们来演示一下。
我们在电脑上分别创建了两个文件,名为文件1.txt、文件2.txt,文件内容如图所示,下面我们用PHP的文件MD5函数计算一下这两个文件MD5码分别是多少
<?php $filename1 = "/home/aaa/文件1.txt"; $md5file1 = md5_file($filename1); echo "文件1md5码:".$md5file1; echo "\r\n"; $filename2 = "/home/aaa/文件2.txt"; $md5file2 = md5_file($filename2); echo "文件2md5码:".$md5file2; echo "\r\n"; ?>
可以看的出计算出来的MD5码是不一样的,我们再把文件2的内容改成和文件1的内容改成一样,再计算一下MD5码
我们可以发现,无论文件名是否一样,只要文件内容是一样的,那么计算出来的MD5码值也会是一样的,那么就可以认为这两个文件本质上是同一个文件。
利用文件MD5值实现秒传功能
好了来到这里,相信大家都知道云盘的文件秒传功能是如何实现的。
用户在上传文件时,本地客户端先会计算出一个文件的MD5码,然后客户端会把MD5码发送给服务器,服务器在数据库查找是否有存在MD5码一样的文件,如果有,则返回上传成功的标识给客户端,如果没有,则返回未上传的标识给客户端,客户端再进行文件的上传。
秒传功能的好处
1.举个例子,如果一部电影几十G,那么,有一万个人上传的话, 云盘就要存储50000个G的数据,而且存的还是同样的一个文件,远远没有做到资源的重复利用.如果使用秒传功能的话,就会大大节省服务器的存储空间。
2.节省了大量的上传时间,假如我们使用有很多文件需要上传到云盘,如果每个文件需要耗时1小时,10个文件就要耗时10个小时,而使用秒传功能则会节省了我们上传的时间。
断点续传原理
上面说到,如果服务器上面存在md5码一样的文件,那么就可以实现文件秒传的功能,那么如果服务器不存在MD5码呢,那么我们还是要乖乖的等待文件上传了^_^。在使用云盘的时候如果文件太大,我们会怕突然断电,文件就需要重新上传了。不用怕,云盘还有一个断电续传的功能。
断点续传说白了就是将一个文件按照一定的规则人为的分割成多个小文件,然后客户端每次只上传一个小文件(当然我们也可以利用多线程技术每次上传多个小文件),服务器接收到上传过来的小文件后根据一定的规则来组合这些小文件。如果在上传过程中出现网络中断等意外情况,下次再次上传时可以从已经上传的部分继续上传,而不是重新上传。
断点续传的意义
断点续传可以使用我们在上传大文件时,可以上传随时随地的停止上传,当我们想再次上传时,只需要从断点的位置继续上传文件块到服务器,而不用重新去上传,这样大大节省了我们的时间。
其实原理都是比较简单的,大型的云盘厂商使用的也是这样的实现,只要我们弄懂其中,也是开发出一个属于自己的云盘系统。