今天和同事在群里讨论“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就可以继续使用。
分享到:
相关推荐
在.NET开发环境中,实现大文件上传并带有进度条...总之,这个项目为你提供了一个使用SwfUpload和.NET实现大文件上传及进度条显示的起点,通过学习和实践,你将能掌握这一功能的实现细节,并能灵活应用于自己的项目中。
QQ群共享上传控件是腾讯QQ为用户设计的一款便捷工具,主要用于提高在QQ群中分享文件的效率。这款控件允许用户快速、批量地上传文件到指定的QQ群,简化了传统的逐个文件发送的繁琐过程,使得群成员能够更方便地获取和...
JSP上传文件(有进度条)可上传大文件 网上有很多文章都是jspsmart,由于jspsmart直接在内存中操作数据,如果上传大文件或多台计算机上传的话会出错,还有一些方法传得比较慢。 为了方便上传文件,本人写了一个传输...
QQ邮箱1G上传控件,便于上传大文件,很好用的,用前安装
综上所述,这个资源提供了一个用易语言编写的程序,可以自动上传文件到QQ群。对于想要学习易语言、自动化操作或对QQ群管理有兴趣的用户来说,这个源码可能很有价值。然而,没有提供完整的下载链接和详细的使用说明,...
### Git 上传大文件 在使用Git管理代码版本的过程中,我们常常会遇到一些特殊情况,比如需要上传较大的文件。本文将详细介绍在Mac上使用Git上传大文件的方法与技巧,并提供具体的步骤指南。 #### 遇到的问题 当你...
这个主题“多文件上传,模仿QQ邮箱”旨在为初学者提供一个学习的实例,让他们了解如何实现类似QQ邮箱的文件上传功能。QQ邮箱作为中国流行的电子邮件服务之一,其文件上传体验已经非常成熟,包括了批量选择、进度显示...
1. 分割大文件为小片。 2. 使用MVC控制器处理每个文件片的上传请求。 3. 维护服务器端状态,记录已上传的文件片。 4. 实现前端AJAX和JavaScript,以显示实时上传进度条。 5. 接收图片并生成缩略图,可能需要借助第三...
标题中的“仿造126,163,QQ邮箱实现的多文件无刷新上传组件”指的是该资源是模仿了126、163和QQ邮箱的文件上传功能,特别是其多文件同时上传并且在页面不刷新的情况下完成的特性。这种技术在现代Web应用中非常常见,...
QQ空间的Flash多文件上传控件是一款用于网页的文件上传工具,它采用了Adobe Flash技术,让用户能够一次性上传多个文件,类似于QQ空间中的功能。这款控件通过JavaScript进行配置,允许开发者自定义允许用户上传的文件...
需要注意的是,设置永久文件需要在QQ群上传文件时进行操作。如果文件已经上传成功,但是没有设置永久,那么文件将会被删除。因此,我们需要在上传文件时,选择“永久保存”选项,以确保文件的长期保存。 此外,我们...
这种方案不仅能够实时展示文件上传进度,还能够模拟出类似QQ邮箱等知名平台的大文件上传窗体功能,极大地提升了用户体验。 #### 二、关键技术点分析 **1. SSH框架简介** - **Struts**:用于构建MVC架构的Web应用...
普通上传要求文件不大于2M。 有了这个控件可以上传20M的图片!
- `queueID`:指定队列元素的ID,显示待上传文件。 - `onSelect`、`onProgress` 和 `onComplete` 等事件回调:用于处理用户选择文件、上传进度和文件上传完成后的操作。 5. **安全性考虑**: 在实际应用中,必须...
为了优化性能,可以采用分块上传大文件,或者利用CDN加速图片传输。 总结来说,QQ头像上传涉及到前端的图片选取、预览、裁剪,后端的文件接收、处理、存储,以及整个流程中的安全性保障和用户体验优化。这一功能的...
在IT领域,大文件上传是一项常见的需求,尤其是在网络服务、社交媒体和协作平台中。Uploadify是一个流行的JavaScript插件,它允许用户实现无刷新的大文件上传功能。本文将深入探讨Uploadify的工作原理,以及如何结合...
acceptFile.jsp文件中,使用FORM标签来上传文件,使用INPUT控件来选择要上传的文件。acceptFile.jsp文件将上传的文件保存到服务器的文件系统中。 三、JSP文件下载的实现 在示例代码中,使用了自定义的UpFile.tag...
在PHP中,大文件上传是常见的需求,但传统的POST方式可能会因为文件过大导致超时或者内存溢出。为了解决这些问题,我们可以利用PHP的文件流(file stream)机制来实现大文件的分块上传,同时支持断点续传功能。这种...
在Java开发中,大文件上传是一项常见的需求,尤其是在云存储、文件分享等场景下。大文件的上传可能会遇到网络不稳定、服务器超时等问题,因此,为了确保文件上传的可靠性和用户体验,通常会采用分块上传和断点续传的...