问题概述
标题: 如果避免用户上传同名文件呢(即相同key值的文件)?
以前自己做存储的时候,是自己计算文件 hash,上传时查询如果存在的就不保存了。
现在改用七牛做存储了,看七牛上传返回的有文件 hash,但是不知道七牛的是如何计算出来的。
有没有办法在上传之前就可以知道七牛的存储空间里有没有相同的 hash 已经存在了,这样就不用向七牛上传相同的文件了,还是仍然需要自己实现这种排重计算?
答:
七牛的 hash 算法是公开的。见: https://github.com/qiniu/qetag
算法大体如下:
-
如果你能够确认文件 <= 4M,那么
hash = UrlsafeBase64([0x16, sha1(FileContent)])
-
如果文件 > 4M,则
hash = UrlsafeBase64([0x96, sha1([sha1(Block1), sha1(Block2), ...])])
-
其中 Block 是把文件内容切分为 4M 为单位的一个个块,也就是
BlockI = FileContent[I*4M:(I+1)*4M]
上传到七牛云存储的时候,key 是可选的。如果你不指定 key,则自动以 hash 值作为 key,此时自动带了消重能力。两个用户上传相同的文件,最终的 key 是一样的。
解决方式:formdata 不指定key
//formData.append('key',name);
网友评论