使用 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)