传言
只要拿到文件的hash值即可将实现文件的分享,事实真的这么简单吗?确实阿里云盘的分享应该就是将要基于秒传
实现,毕竟现在还没有出来所以这些都是预测
秒传
实验,传送一个将近10m
的文件到底需要多久?
- 文件预览
- 实际上我已经基本参透了,阿里的上传原理才发的这篇文章,所以在这之前已经使用Python复现了阿里网盘的秒传,下面是测试代码
- 测试文件夹并没有任何的文件
-
结果
-
一秒都没用到传输就完成了
-
原理
-
前端预计算hash值,但不完全hash,取
1kb
先计算进行hash -
到后端去匹配
{"drive_id":"#设备id", "part_info_list":[{"part_number":1}], "parent_file_id":"#文件夹id", "name":"#文件名", "type":"file", "check_name_mode":"auto_rename", "size":"#文件大小", "pre_hash":"#取1kb大小文件hash1计算" }
-
如果冲突返回的状态码为
409
-
如果冲突就发送妙传指令,因为已经存在了,所以就不用前端再次通过网络传送文件到阿里的文件服务器了
-
拿着该文件的信息加到我们自己的文件列表数据库中完成秒传
既然秒传能实现那分享不是水到渠成?
- 拿到hash那我不就可以拿到任何文件了吗?那这样安全吗?你能想到阿里当然能想到了。
阿里如何避免拿到hash就可以拿到文件的呢?
-
先看看请求参数
{"drive_id":"#设备id", "part_info_list":[{"part_number":1}], "parent_file_id":"#存放地址", "name":"#文件名", "type":"file", "check_name_mode":"auto_rename", "size":"#文件大小", "content_hash":"#完整的文件hash1", "content_hash_name":"sha1", "proof_code":"#通过token计算的到的范围,截取文件后得到的base64值", "proof_version":"v1"}
-
就一点你确确实实有该文件,我想让你从该文件的任何地方获取一段字节码,你应该都能给我,然后和后端的已经存在的文件作比较,确实相等,我认为你确认拥有该文件,允许访问该文件,将文件秒传给你
-
如何保证真的随机获取?且每个人唯一?
token
具有唯一性和时效性再合适不过了,阿里通过token
计算要获取哪段的字节码 -
如果要你想要分享怎么办?那你就必须使用一台公网服务器,告诉我你要的文件、你的token,我这边确实有该文件,通过token得到随机范围,截取文件得到对应
base64
,返回json
发送请求,完成秒传,分享。