QQ上传大文件为什么这么快
2010-06-01 12:32
253 查看
今天和同事在群里讨论“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就可以继续使用。
有时候我们通过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就可以继续使用。
相关文章推荐
- QQ上传大文件为什么这么快
- QQ大文件为何上传这么快
- 为什么Ubuntu 下的svn 没有上传.so 的库文件?
- 七牛上传文件为什么在快上传完的时候(95%)经度会停留很久?
- Struts2 文件上传为什么会自动生成对应file的fileName和ContentType
- 如何通过ftp上传文件?【专业建各类网站QQ864205023】
- 为什么有些文件上传后无法管理
- Struts2 当上传的文件大小超过限制大小的时候,为什么没收到任何提示?
- 为什么我上传了flv或MP4文件到服务器,可输入正确地址通过http协议来访问总是出现“无法找到该页”的404错误呢
- VS2008中,MFC对话框类实现类似QQ拖拽上传文件的功能,CWnd::OnDropFiles
- python采集博客中上传的QQ截图文件
- Volley为什么不适合上传下载大文件,为什么适合频率高数据量小的通信?
- 为什么我上传了flv或MP4文件到服务器,可输入正确地址通过http协议来访问总是出现“无法找到该页”的404错误呢?这就表明mp4格式文件是服务器无法识别的,其实,这是没有在iis中将相应的MIME类型进行设置的原因。那该怎样设置MIME
- 通过QQ上传文件到手机
- 为什么上传文件的表单里要加个属性 enctype
- 七牛上传同名文件为什么没有报错解答
- 为什么文件上传不了啊???
- 为什么上传文件的form里要加属性enctype
- python采集博客中上传的QQ截图文件
- 前端文件上传,struts2后台返回json数据,在IE为什么会以文件下载的形式打开。