我需要在我的AngularJS应用程序中获取上传文件的摘要,但结果摘要与我用bash获得的文件摘要不同。
我开始使用jshashes,但是当我看到结果哈希(在网络应用上)与我在本地使用bash的哈希不同时,我决定转移到CryptoJS。但结果是一样的,上传文件的哈希值仍然不同。
这是我的代码:
var reader = new FileReader();
reader.readAsBinaryString(controller.file);
controller.fileHash = CryptoJS.SHA256(reader.result).toString(CryptoJS.enc.Hex);
正如您所看到的,代码非常简单,只需使用FileReader
从变量中读取上传的文件,然后将值转换为BinaryString,对内容进行哈希处理,最后将结果分配给另一个可以显示它的控制器在html。
在我的shell(本地环境)中获取文件摘要,我运行以下命令:
$ shasum -a 256 [path/to/file]
为了上传文件,请使用ng-file-upload
我失踪了什么?如果有人可以帮助我或指导我看到解决方案,我会非常感激。
提前谢谢。
更新1 :
正如@destroyer在下面的评论中所说readAsBinaryString
已被弃用,而且它是一种异步方法,所以这是我的实际代码:
var reader = new FileReader();
reader.onload = function() {
controller.fileHash = CryptoJS.SHA256(reader.result).toString(CryptoJS.enc.Hex);
};
reader.readAsArrayBuffer(controller.file);
我尝试了this解决方案,以便将ArrayBuffer
对象转换为BinaryString
。但结果仍然是错误的。
答案 0 :(得分:1)
readAsBinaryString
,您应该使用readAsArrayBuffer
。
无论哪种方式,这些函数都会启动异步操作,其结果是您在FileReader
实例load
事件中读取的内容。
var reader = new FileReader();
reader.onload = function(){
controller.fileHash = CryptoJS.SHA256(reader.result).toString(CryptoJS.enc.Hex);
};
reader.readAsArrayBuffer(controller.file);
反思我们在评论中的对话:问题是crypto-js
不对二进制文件进行操作,而是对字符串进行操作。
您可以直接在js-sha256
获得支持ArrayBuffer
的SHA256实现。