使用 JS 的文件上的 cryptoJS.MD5
cryptoJS.MD5 on a file using JS
我想在客户端计算一个文件的MD5。我已经使用 cryptoJS.MD5 完成了它。它在任何字符串输入上都能正常工作,但对于文件却没有。你能帮我知道我错过了什么吗?提前致谢!!
<html>
<head>
<script src="http://crypto-js.googlecode.com/svn/tags/3.1.2/build/rollups/md5.js"></script>
<script>
function fn()
{
var reader = new FileReader();
reader.onloadend=function(){
text = (reader.result);
reader.readAsBinaryString(document.getElementById("files").files[0]);
var hash1 = CryptoJS.MD5(text);
console.log("hash1="+hash1.toString());
}
var hash = CryptoJS.MD5("Message");
console.log("hash=" + hash.toString());
alert("hi");
}
</script>
</head>
<body>
<form name="myform" id="myform" method="post" action="" enctype="multipart/form-data">
<input type="file" name="files" id="files">
<input type="submit" onclick="fn()">
</form>
</body>
</html>
哎呀。这里有几个问题。
首先,您的表单已提交,因此一旦页面刷新,您登录到控制台的任何内容都将消失。去掉表单标签;毕竟,您实际上并没有向服务器提交任何内容。
其次,开始读取文件 (readAsBinaryString
) 的行是 inside 读取完成时调用的回调...所以读取文件从未真正开始。将该行移到回调之外。
最后,JavaScript 并没有真正的二进制字符串类型。我们 将 视为二进制字符串的内容仍然是 UTF-16 字符。但是 CryptoJS 无法判断您的 UTF-16 字符串是用来表示二进制数据的。因此,您必须明确说明要使用的字符到字节编码:
CryptoJS.enc.Latin1.parse(text)
我想在客户端计算一个文件的MD5。我已经使用 cryptoJS.MD5 完成了它。它在任何字符串输入上都能正常工作,但对于文件却没有。你能帮我知道我错过了什么吗?提前致谢!!
<html>
<head>
<script src="http://crypto-js.googlecode.com/svn/tags/3.1.2/build/rollups/md5.js"></script>
<script>
function fn()
{
var reader = new FileReader();
reader.onloadend=function(){
text = (reader.result);
reader.readAsBinaryString(document.getElementById("files").files[0]);
var hash1 = CryptoJS.MD5(text);
console.log("hash1="+hash1.toString());
}
var hash = CryptoJS.MD5("Message");
console.log("hash=" + hash.toString());
alert("hi");
}
</script>
</head>
<body>
<form name="myform" id="myform" method="post" action="" enctype="multipart/form-data">
<input type="file" name="files" id="files">
<input type="submit" onclick="fn()">
</form>
</body>
</html>
哎呀。这里有几个问题。
首先,您的表单已提交,因此一旦页面刷新,您登录到控制台的任何内容都将消失。去掉表单标签;毕竟,您实际上并没有向服务器提交任何内容。
其次,开始读取文件 (readAsBinaryString
) 的行是 inside 读取完成时调用的回调...所以读取文件从未真正开始。将该行移到回调之外。
最后,JavaScript 并没有真正的二进制字符串类型。我们 将 视为二进制字符串的内容仍然是 UTF-16 字符。但是 CryptoJS 无法判断您的 UTF-16 字符串是用来表示二进制数据的。因此,您必须明确说明要使用的字符到字节编码:
CryptoJS.enc.Latin1.parse(text)