关于文件的断点上传,网上的很多例子,有好有坏吧。最失望的是,在知网下载了十篇论文,感觉都是在瞎扯淡,目测是大学生的毕业设计吧,反正很失望。

主要是剖析了腾讯邮箱的文件上传,发现和我自己实现的大致相同,所以直接分析腾讯邮箱的上传吧。

基本概念

文件上传主要是利用了文件内容进行哈希运算,最终得到一个哈希字符串来当做文件的唯一签名。

利用文件的签名还可以实现快传。

  1. 什么是快传?
  • 简单的说就是当一个文件已经存在于服务器上,再次上传该文件时,可以通过文件签名判断是否存在,如果存在直接返回上传成功,用户就会感到一下子就上传好了,这就是快传。
  1. 实现断点上传的问题
  • 断点上传需要前端进行文件签名计算,而js进行计算是效率很低的一件事,影响用户体验。
  1. 既然js计算效率,怎么解决?
  • 目前我是找了一个很高效的库来提高效率,效率还是挺不错。感谢ph2给我找的这个库。点击链接下载查看
开始分析腾讯邮箱文件上传

1 打开浏览器控制台并上传文件,如图
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nIPum8GL-1638330220460)(http://file.5tangs.com/2018-January-26-0-40-56-fileUpload-1.png)]
可以看到看到该请求与返回值,

  • exist用于判断文件是否存在,exist=0说明没有上传过,exist=1说明上传过
  • sFileId应该就是该文件的id
  • sIp可能是文件上传的服务器地址
  • sKey就是用于加密的身份秘钥
  • sMailId可能就是我的邮箱的某个id吧,每次上传都不一样,对我也不重要

再看请求值
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8fZkKNhL-1638330220461)(http://file.5tangs.com/2018-January-26-0-51-21-fileUpload-2.png)]
这里是获取了文件的size,md5,sha

{"path":"hh.txt","appid":"","size":16933060,"md5":"59bc1883c7879c31e555197786f3b360","sha":"981992c1ae468d79fa4f0a47268a5e262fea166f","sha3":""
}

服务器就通过了md5,sha可能还加上了size来判断文件的是否存在。

为什么需要md5和sha两个哈希值来判断文件的唯一性,巴拉巴拉等等原因就因为会发生哈希碰撞,而且MD5已经被声明不是一个很安全的散列算法了,当然,不安全对我们普通程序员来说,也没简单易行省时省力的办法让他进行碰撞。

2 ftn_hander在干什么?
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PYxfzaPS-1638330220463)(http://file.5tangs.com/2018-January-26-1-3-50-fileUpload-3.png)]

首先POST方法是肯定的,在请求头里:

  • Content-Length: 请求数据的长度
  • DATA-MD5字段,这个MD5是上传的每个片段的MD5值

首先的一个概念,断点上传,是将一个大文件,切分为多个小片段,然后一个片段接一个的上传。为了防止文件传输过程中被篡改,最简单的方法就是对每一个片段进行哈希运算当做片段的签名,然后服务器对每一个片段进行检验,这里只做了MD5的验证。

然后第二个红框这部分的乱码内容,就需要自行查看js源码了,主要的内容大概就是对上文中的sFileId, sKey,sMailId 有没有MD5忘记了,等等几个值分别计算编码,最终得到这样一个乱码,然后这个乱码再加上文件内容,最后提交到服务器,服务器在解码验证。

3 等待文件上传完成
文件上传完成,并且验证通过,那就上传成功咯,否则就返回错误咯。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Z6e8T0ma-1638330220464)(http://file.5tangs.com/2018-January-26-1-16-41-fileUpload-4.png)]

每一个分片上传完成后,返回了这样一个玩意儿。时间已经过去一个多月了,我忘记了这玩意是说什么的,但是映象中是返回了下一个文件片段的偏移量和当前上传状态状态值(是否上传完成)。

文件分片上传时,每一个分片上传后都会返回一个偏移量,就是服务器接收到了多少数据,下一个数据需要从原文件的多少个字节开始传递。

比如一个文件100字节,分片大小为16字节,已经上传了32字节。继续上传时上传了0-16字节,服务器会拒绝这段数据并返回一个偏移量33给你,告诉你要从33开始上传,于是上传了33-48字节,服务器又会返回49给你。直到文件上传完成。

4 关于断点上传前端兼容性
关于兼容性读取文件后需要用到js的blob,但是blob是有兼容性问题的,所以对IE,目测只能写浏览器插件了。

到此,分步分析文件上传就是如上所说了。

细节内容补充

1 每次上传文件不论文件是否上传,都会先上传本地文件前64KB的文件,如果文件已上传完成,则返回成功,否则继续上传未上传完的内容,继续上传时,分片大小为512KB。
<br>
<br>
我一直想不明白上传重复文件时为什么还是需要上传60KB,因为第一个请求uploadunite就已经可以告诉前端文件是否上传过,是否上传完成,若没上传完成,可以直接返回偏移量,所以上传重复文件时还要再上传60KB,感觉没必要。

------ 2021.12.01
时隔3年,我觉得我知道为什么上传时要重复上传前60KB的文件了,通过md5和sha1的哈希计算,是能保证一定程度上,文件的唯一性,但是腾讯面临海量的文件,在hash值中存在一个概率使得一个文件的sha1和md5同时一样。
而为了区分两种hash同时碰撞

分析腾讯QQ网页文件断点上传相关推荐

  1. Akka实战:HTTP大文件断点上传、下载,秒传

    2019独角兽企业重金招聘Python工程师标准>>> 访问:https://github.com/yangbajing/scala-applications/tree/master ...

  2. android学习笔记---32_文件断点上传器,解决多用户并发,以及自定义协议,注意协议中的漏洞

    32_文件断点上传器 --------------------------- 1.当文件很大的时候就无法通过http协议进行上传了,因为get,post的安全原因,很多服 务器会   禁止这些协议,而 ...

  3. asp.net 如何实现大文件断点上传功能?

    之前仿造uploadify写了一个HTML5版的文件上传插件,没看过的朋友可以点此先看一下~得到了不少朋友的好评,我自己也用在了项目中,不论是用户头像上传,还是各种媒体文件的上传,以及各种个性的业务需 ...

  4. android实现大文件断点上传

    前言 之前项目需要上传大文件的功能,上传大文件经常遇到上传一半由于网络或者其他一些原因上传失败.然后又得重新上传(很麻烦),所以就想能不能做个断点上传的功能.于是网上搜索,发现市面上很少有断点上传的案 ...

  5. java 断点上传_java HTTP文件断点上传

    之前仿造uploadify写了一个HTML5版的文件上传插件,没看过的朋友可以点此先看一下~得到了不少朋友的好评,我自己也用在了项目中,不论是用户头像上传,还是各种媒体文件的上传,以及各种个性的业务需 ...

  6. php+大文件断点上传

    总结一下大文件分片上传和断点续传的问题.因为文件过大(比如1G以上),必须要考虑上传过程网络中断的情况.http的网络请求中本身就已经具备了分片上传功能,当传输的文件比较大时,http协议自动会将文件 ...

  7. 网页文件分片上传,断点续传

    总结一下大文件分片上传和断点续传的问题.因为文件过大(比如1G以上),必须要考虑上传过程网络中断的情况.http的网络请求中本身就已经具备了分片上传功能,当传输的文件比较大时,http协议自动会将文件 ...

  8. php文件断点上传文件,php大文件上传支持断点上传

    一个php大文件上传案例,可以支持断点续传,暂不支持文件上传演示 难易:中级 下载资源 下载积分: 200 积分 /** * 配置文件(如果没有默认字样,说明默认值就是注释下的值) * 但是,on*( ...

  9. Android应用开发之使用Socket进行大文件断点上传续传

    http://blog.csdn.net/binyao02123202/article/details/7460517

最新文章

  1. Oracle中dbms_job包的使用
  2. PAT甲级1153 Decode Registration Card of PAT :[C++题解]结构体、哈希表、排序、类似数据库查询题、好题
  3. Cisco路由器密码恢复方法
  4. 【Linux】一步一步学Linux——netstat命令(166)
  5. matlab 功率谱分析函数psd用法
  6. Leetcode 9. 回文数(Palindrome Number)
  7. ubuntupython损坏_修复损坏的Python3.2安装(Ubuntu)
  8. 无法嵌入互操作类型 请改用适用的接口_可微编程-自上而下的产品形态 4 Python互操作性...
  9. CGLI 报错 :VerifyError: class net.sf.cglib.core.DebuggingClassWriter overrides final method visit
  10. security工作笔记007---spring security自定义AuthenticationProvider,验证规则
  11. Php wordpress安全性,使用 .htaccess 提高 WordPress 的安全性和可用性
  12. Linux vi命令详解与使用教程
  13. 微信卡券管理 - 修改卡券基本信息
  14. android系统密码设置功能,手机锁屏设置!安卓手机锁屏密码设置技巧?
  15. Beer Bill(签到题)
  16. Java+高级篇+单核CPU vs 多核CPU
  17. xxx-1.0-SNAPSHOT.jar中没有主清单属性的解决方法
  18. hpuoj 1725: 感恩节KK专场——特殊的比赛日期 (素数判断)
  19. Windows、Mac系统常用的SSH工具软件整理汇总
  20. 网络 | NAT、SNAT、DNAT

热门文章

  1. Mysql群集MHA高可用配置(所爱隔山海,山海皆可平)
  2. Java编程简单应用———1、HelloWorld(HelloWorld的来源);2、输出个人信息3、输出特殊图案...
  3. SuperMap GIS基础软件中数据库使用指南
  4. linux sed 删除文件前两行和删除文件后两行
  5. Barsetto百胜图美式全自动磨豆咖啡机,好“咖”多磨
  6. 【复变函数与积分变换】目录
  7. 力扣 -- 309. 最佳买卖股票时机含冷冻期
  8. android tinker 加固,Android 7.0系统上360加固补丁异常
  9. 【推荐】企业数字化转型资料合集
  10. yolo-fastest模型