今天和同事在群里讨论“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就可以继续使用。
分享到:
相关推荐
JSP上传文件(有进度条)可上传大文件 网上有很多文章都是jspsmart,由于jspsmart直接在内存中操作数据,如果上传大文件或多台计算机上传的话会出错,还有一些方法传得比较慢。 为了方便上传文件,本人写了一个传输...
QQ邮箱1G上传控件,便于上传大文件,很好用的,用前安装
模仿QQ邮箱的大文件上传功能,带进度条,源代码,可自行修改,基于swfupload制作
如何利用 Java 实现 QQ 文件传输功能 现在, 通过网络传输文件已经非常普遍, 各种传输工 具也很多, 最具有代表性的就是 QQ 提供的文件传输功能了, 它能让好友之间方便的把自己的文件传给对方。 仔细查看 QQ 的...
普通上传要求文件不大于2M。 有了这个控件可以上传20M的图片!
多文件上传,文件上传,模仿QQ邮箱,供初学者学习。
mac本使用git上传大文件,内容详细,简单,易操作
php+html5实现无刷新上传,大文件分片上传,断点续传具体案例完整代码 详情:https://blog.csdn.net/qq43599939/article/details/79762042
类似QQ空间的Flash多文件上传控件,可在js中定义允许上传的类型、大小
类似qq邮箱附件上传功能,选择文件逐条自定上传,删除等,后台java
该工程基于 .net framework 4.6.1 mvc 开发! 实现大文件分片上传,实时上传进度条! 上传图片并生成缩略图片!
QQ群上传共享文件的时提示上传失败该怎么办?.docx
简单的仿QQ界面源码,含服务器与客户端。实现实时聊天,上传文件。界面简单,如果需要漂亮的界面C++版本
iis默认的最大上传文件为2M,虽然可以手动修改这一配置,但是更大的配置意味着服务器需要提供更多的内存。本组件支持断点续传,其原理是把一个大文件切成一个个小的包进行上传,服务端收到的每个包都是一个“独立”...
uploadify无刷新大文件上传,php后台程序,完全实现无刷新上传
仿造126,163,QQ邮箱实现的多文件无刷新上传组件,下载即可使用,包括有asp、.net、php、jsp的四种语言的实现
asp无刷新上传文件ajax上传文件 请将本程序放到你的虚拟主机上运行,如果本地有iis也可以。有些同学有简易iis服务器,不适用本程序的,因为有部分中文字符不能识别导致无法运行。 如果需要上传多文件可以把index....
如果上传大小为0则认为没有上传过,重新上传,如果上传文件大小大于0则从已上传的切片的下一个切片开始上传。 Plupload分片上传使用了html5的新特性,针对ie8 ie9等不支持html5的情况,采用flash等进行分片上传, ...