`
#rethink#
  • 浏览: 46893 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

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邮箱大文件上传组件,带进度条,.net版本

    在.NET开发环境中,实现大文件上传并带有进度条...总之,这个项目为你提供了一个使用SwfUpload和.NET实现大文件上传及进度条显示的起点,通过学习和实践,你将能掌握这一功能的实现细节,并能灵活应用于自己的项目中。

    QQ群共享上传控件

    QQ群共享上传控件是腾讯QQ为用户设计的一款便捷工具,主要用于提高在QQ群中分享文件的效率。这款控件允许用户快速、批量地上传文件到指定的QQ群,简化了传统的逐个文件发送的繁琐过程,使得群成员能够更方便地获取和...

    JSP上传文件(有进度条)可上传大文件

    JSP上传文件(有进度条)可上传大文件 网上有很多文章都是jspsmart,由于jspsmart直接在内存中操作数据,如果上传大文件或多台计算机上传的话会出错,还有一些方法传得比较慢。 为了方便上传文件,本人写了一个传输...

    QQ邮箱1G控件,便于上传大文件

    QQ邮箱1G上传控件,便于上传大文件,很好用的,用前安装

    全自动给QQ群上传群文件易语言源码

    综上所述,这个资源提供了一个用易语言编写的程序,可以自动上传文件到QQ群。对于想要学习易语言、自动化操作或对QQ群管理有兴趣的用户来说,这个源码可能很有价值。然而,没有提供完整的下载链接和详细的使用说明,...

    Git 上传大文件

    ### Git 上传大文件 在使用Git管理代码版本的过程中,我们常常会遇到一些特殊情况,比如需要上传较大的文件。本文将详细介绍在Mac上使用Git上传大文件的方法与技巧,并提供具体的步骤指南。 #### 遇到的问题 当你...

    多文件上传,模仿QQ邮箱

    这个主题“多文件上传,模仿QQ邮箱”旨在为初学者提供一个学习的实例,让他们了解如何实现类似QQ邮箱的文件上传功能。QQ邮箱作为中国流行的电子邮件服务之一,其文件上传体验已经非常成熟,包括了批量选择、进度显示...

    C# .net framework MVC 大文件分片上传

    1. 分割大文件为小片。 2. 使用MVC控制器处理每个文件片的上传请求。 3. 维护服务器端状态,记录已上传的文件片。 4. 实现前端AJAX和JavaScript,以显示实时上传进度条。 5. 接收图片并生成缩略图,可能需要借助第三...

    仿造126,163,QQ邮箱实现的多文件无刷新上传组件

    标题中的“仿造126,163,QQ邮箱实现的多文件无刷新上传组件”指的是该资源是模仿了126、163和QQ邮箱的文件上传功能,特别是其多文件同时上传并且在页面不刷新的情况下完成的特性。这种技术在现代Web应用中非常常见,...

    类似QQ空间的Flash多文件上传控件

    QQ空间的Flash多文件上传控件是一款用于网页的文件上传工具,它采用了Adobe Flash技术,让用户能够一次性上传多个文件,类似于QQ空间中的功能。这款控件通过JavaScript进行配置,允许开发者自定义允许用户上传的文件...

    QQ群上传的共享文件怎么设置成永久?.docx

    需要注意的是,设置永久文件需要在QQ群上传文件时进行操作。如果文件已经上传成功,但是没有设置永久,那么文件将会被删除。因此,我们需要在上传文件时,选择“永久保存”选项,以确保文件的长期保存。 此外,我们...

    用SSH+ajax实现的上传进度条,仿qq邮箱的大文件上传窗体

    这种方案不仅能够实时展示文件上传进度,还能够模拟出类似QQ邮箱等知名平台的大文件上传窗体功能,极大地提升了用户体验。 #### 二、关键技术点分析 **1. SSH框架简介** - **Struts**:用于构建MVC架构的Web应用...

    QQ空间相册大文件上传控件

    普通上传要求文件不大于2M。 有了这个控件可以上传20M的图片!

    uploadify文件异步上传

    - `queueID`:指定队列元素的ID,显示待上传文件。 - `onSelect`、`onProgress` 和 `onComplete` 等事件回调:用于处理用户选择文件、上传进度和文件上传完成后的操作。 5. **安全性考虑**: 在实际应用中,必须...

    qq头像上传

    为了优化性能,可以采用分块上传大文件,或者利用CDN加速图片传输。 总结来说,QQ头像上传涉及到前端的图片选取、预览、裁剪,后端的文件接收、处理、存储,以及整个流程中的安全性保障和用户体验优化。这一功能的...

    大文件上传

    在IT领域,大文件上传是一项常见的需求,尤其是在网络服务、社交媒体和协作平台中。Uploadify是一个流行的JavaScript插件,它允许用户实现无刷新的大文件上传功能。本文将深入探讨Uploadify的工作原理,以及如何结合...

    JSP实现文件上传与下载.pdf

    acceptFile.jsp文件中,使用FORM标签来上传文件,使用INPUT控件来选择要上传的文件。acceptFile.jsp文件将上传的文件保存到服务器的文件系统中。 三、JSP文件下载的实现 在示例代码中,使用了自定义的UpFile.tag...

    PHP文件流实现大文件上传

    在PHP中,大文件上传是常见的需求,但传统的POST方式可能会因为文件过大导致超时或者内存溢出。为了解决这些问题,我们可以利用PHP的文件流(file stream)机制来实现大文件的分块上传,同时支持断点续传功能。这种...

    java大文件分块上传断点续传demo

    在Java开发中,大文件上传是一项常见的需求,尤其是在云存储、文件分享等场景下。大文件的上传可能会遇到网络不稳定、服务器超时等问题,因此,为了确保文件上传的可靠性和用户体验,通常会采用分块上传和断点续传的...

Global site tag (gtag.js) - Google Analytics