IT技术博客大学习 共学习 共进步

QQ上传大文件为什么这么快

博客园-rethink log 2010-06-01 13:08:14 浏览 13,081 次

今天和同事在群里讨论“QQ上传大文件/QQ群发送大文件时,可以在极短的时间内完成”是如何做到的。

有时候我们通过QQ上传一个几百M的文件,竟然只用了几秒钟,从带宽上限制可以得出,实际上传文件是不可能的。

实现的思路肯定是根据文件内容生成一个“唯一的标识符”,根据这个标识符去判断服务器上是否已经存在这个文件,如果存在,则不需要再次上传。

但是根据文件内容生成“唯一的标识符”,效率会不会有问题呢。

于是用php做个最简单的测试:

以下是代码片段:
 <?php   
include("./Timer.class.php");//timer类用于统计程序运行时间
Timer::getInstance()->start();//开始计时
$big_string = file_get_contents("./test.zip");//读取文件内容
echo "文件大小是:".strlen($big_string)/(1024*1024)."MB<BR>";//输出文件大小
echo md5($big_string)."<BR>";//输出MD5后的字符串
Timer::getInstance()->printTime();//输出耗费的时间
?>

输出结果如下:

以下是引用片段:

文件大小是:487.146002769MB
c9cb9487b71fa2130b5d1110a2819e34
Timer NO:1 Did something in 3.28920602798 seconds;

可以看到,MD5一个487M的文件,只用了3.29秒,比我预想的快了许多。因此,通过“md5('文件内容')”生成“唯一标识符”的方法是完全可行的,效率不会存在问题,我想上面的方法肯定还有优化的空间。QQ的大文件快速上传估计就是通过这样的方式实现的。在上传大文件的时候,先查询下服务器看看文件的“唯一标识符”是否存在,只要这个标识符存在,就不用再上传文件了。

扩展:

1  由于md5的特性,“md5('文件内容')”也可以用于校验“文件的完整性”和“内容是否有被修改过”,这也是我们下载一些软件时,在旁边能看到MD5效验码的原因。

2  APACHE 的 ETAG 实现:APACHE 的 ETAG 是可以自己定义方法的,较普遍的做法是根据文件的内容生成ETAG。

因为当有多台web服务器时,以浏览图片为例,想要让浏览器缓存你的图片。但你传到不同服务器上的图片时间不会一致,所以不能用文件的last_modify时间作为cache的参照,这时候就可以采取发送ETAG,ETAG是按照图片内容生成特定字符串的。只要文件内容没有改变,ETAG就不会改变,cache就会有效。

建议继续学习

  1. 介绍几个QQ开源项目及协议下载 (阅读 10,080)
  2. 10个强大的Ajax jQuery文件上传程序 (阅读 8,720)
  3. 解决securecrt rz 上传rar,gif文件不正确问题 (阅读 7,780)
  4. md5到md5破解的一些科普 (阅读 6,380)
  5. PHP处理Etag、lastModified和Expires (阅读 5,960)
  6. PHP上传进度条深度解析 (阅读 5,920)
  7. Codeigniter里的无刷新上传 (阅读 5,420)
  8. 利用QQ游戏破解QQ密码 (阅读 5,180)
  9. PHP上传文件类型彻底判断方案及PHP+nginx上传大小彻底控制方案 (阅读 4,940)
  10. 产品设计之QQ邮箱登录页与淘宝登录页 (阅读 4,582)