问题描述
我做了一个类似百度网盘功能的私人网盘,单纯是玩玩的,已经实现了文件的秒传,现在增加了一个离线下载的功能。虽然功能上模拟出了一半,但是唯一的问题就是,百度网盘的离线下载是可以秒杀的,但是我的网盘做不了。因为找了很久也找不到不下载文件就可以获得文件MD5值的方法。我的思路是,如果可以从链接就可以获得MD5值的话,那我可以和我数据库里面已存的文件进行对比,有的话就不用下载,没有的话再下载。但是现在获取不了(又或者说我不会获取),硬要实现的话只能下载好文件,计算出MD5值,再对比,有相同的,删除下载的文件,没相同的再写入数据库。这种方法只能节约了服务器的硬盘,时间和带宽都会浪费了。有没有什么方法可以不下载文件就知道文件的MD5值?如果有的话要怎样实现?如果我的思路是错的话,那么百度或者迅雷这些的离线下载秒杀是如何实现的?
解决方案
解决方案二:
MARK等待大神!
解决方案三:
弱弱的问下,文件秒传是怎么个思路法?
解决方案四:
引用2楼subxli的回复:
弱弱的问下,文件秒传是怎么个思路法?
比较文件hash值
解决方案五:
引用2楼subxli的回复:
弱弱的问下,文件秒传是怎么个思路法?
服务器上同样hash值的文件只保存一份,上传只是得到了对这个文件的访问权
解决方案六:
我猜一是根据URL,二是文件尺寸,三是多段少量文件数据另BT种子和ED2K链接自身就带有hash
解决方案七:
1.文件大小3.取头1K的数据的md5就可以了
解决方案八:
人家访问量那么大。服务器存的文件,很多人共享一个。比如一个热门电影,20万人要离线下载,服务器仅仅下载一份,其他人下载都是虚拟“下载”。你怎么说是浪费硬盘盒空间?其他人下载的时候简单比较url就行了,如果不是http的话更好了,url直接就提供有md5了。网盘难点是大数据,高负载,高可扩展。
解决方案九:
引用6楼wyd1520的回复:
1.文件大小3.取头1K的数据的md5就可以了
这个有点不太精准吧?比如一个文本文件,如果修改替换了几个标点或几个字符,那么他的大小不会变,而替换的标点或字符也可能不在前1K数据之内,所以求得的md5值还是一样的,但其实文件显然不同
解决方案十:
引用8楼webdiyer的回复:
Quote: 引用6楼wyd1520的回复:
1.文件大小3.取头1K的数据的md5就可以了这个有点不太精准吧?比如一个文本文件,如果修改替换了几个标点或几个字符,那么他的大小不会变,而替换的标点或字符也可能不在前1K数据之内,所以求得的md5值还是一样的,但其实文件显然不同
忘了加URL了。
解决方案十一:
引用9楼wyd1520的回复:
忘了加URL了。
加上url也不行,很多下载网站文件更新后,url是不变的
解决方案十二:
md5的值直接用作文件名应该是没问题的吧
解决方案十三:
引用4楼KarasCanvas的回复:
Quote: 引用2楼subxli的回复:
弱弱的问下,文件秒传是怎么个思路法?服务器上同样hash值的文件只保存一份,上传只是得到了对这个文件的访问权
学习了。
解决方案十四:
虽然我也是不是很了解,但是我思考过这个问题,推荐楼主去了解一下在开始下载一个文件之前,请求和返回的过程各自做了些什么事情取得了什么东西,个人猜测可能会有一点发现
解决方案十五:
引用8楼webdiyer的回复:
这个有点不太精准吧?比如一个文本文件,如果修改替换了几个标点或几个字符,那么他的大小不会变,而替换的标点或字符也可能不在前1K数据之内,所以求得的md5值还是一样的,但其实文件显然不同
像httpheader里的last-modified,etag都可以作为参考,你要告诉我一个假的就没办法了
解决方案:
http的话主要是靠url和文件大小,来判断伪造hash百度网盘的秒传是会出错的
解决方案:
引用11楼liuchaolin的回复:
md5的值直接用作文件名应该是没问题的吧
可以。不过不要叫“文件名”,叫“文件ID”更好。
解决方案:
要秒杀文件只存了一份,但是这份文件对应的链接(http://...)可以有成百上千个迅雷的数据库里面存了非常多的链接,只要被请求过一次就会被存下来,等下一次有新用户请求相同的链接时,就可以显示被秒杀了,如果说不下载就知道MD5的值的话是不可能的。MD5本身就是一种摘要算法,没有下载,怎么摘。迅雷这牛,其实关键是它的链接数据库。
解决方案:
楼主能不能分享一下你的私人网盘实现的代码呀,万分感谢!!