获取文件MD5值(JS、JAVA)

文章HTML代码翻译于地址:https://www.cnblogs.com/linyihai/p/7040786.html

文件MD5有啥用?

  文件上传时会上传文件的信息此时将文件的md5上传,服务器中存储这个md5值,并存储这个md5值所对应的已上传字节长度,比如未上传对应为0,已上传对应为-1,已上传200字节就对应200,这个上传的时候可以匹配到这个文件在服务器中的状态,方便做断点续传,只要源文件没有更改,即使换个名字,换个账户都可以在服务器找到对应的文件,所以当服务器中有已经上传完毕的此文件时,别人再上传这个文件就可以实现秒传。

  下面代码实现HTML选择文件获取MD5值、JAVA根据文件地址获取文件MD5值。

<!DOCTYPE html>
<html>
  <head>
      <meta charset="utf-8">
  </head> 
  <body>
     <form id="fileupload" action="" method="POST" enctype="multipart/form-data">
        <div>
            <div>                                                             
                添加文件
                <input type="file" name="" id="fileinput">                                                                     
            </div>

            <progress class='progressbar' value="0" max="100" style='500px;margin-top:20px'></progress>
            <div style='margin-top:20px'>
                <span id="handler_info" ></span>
            </div>
        </div>   
    </form>
    <!-- https://github.com/satazor/js-spark-md5 -->
    <script src="spark-md5.min.js" type="text/javascript"></script>
    <script>
        function get_filemd5sum(ofile) {
            var file = ofile;
            var tmp_md5;
            var blobSlice = File.prototype.slice || File.prototype.mozSlice || File.prototype.webkitSlice,
                // file = this.files[0],
                chunkSize = 8097152, // Read in chunks of 2MB
                chunks = Math.ceil(file.size / chunkSize),
                currentChunk = 0,
                spark = new SparkMD5.ArrayBuffer(),
                fileReader = new FileReader();

            fileReader.onload = function(e) {
                // console.log('read chunk nr', currentChunk + 1, 'of', chunks);
                spark.append(e.target.result); // Append array buffer
                currentChunk++;
                var md5_progress = Math.floor((currentChunk / chunks) * 100);

                console.log(file.name + "  正在处理,请稍等," + "已完成" + md5_progress + "%");
                var handler_info = document.getElementById("handler_info");
                var progressbar = document.getElementsByClassName("progressbar")[0];
                handler_info.innerHTML=file.name + "  正在处理,请稍等," + "已完成" + md5_progress + "%"
                progressbar.value =md5_progress;
                if (currentChunk < chunks) {
                    loadNext();
                } else {
                    tmp_md5 = spark.end();
                    console.log(tmp_md5)
                    handler_info.innerHTML = file.name + "的MD5值是:" + tmp_md5;
                }
            };

            fileReader.onerror = function() {
                console.warn('oops, something went wrong.');
            };

            function loadNext() {
                var start = currentChunk * chunkSize,
                    end = ((start + chunkSize) >= file.size) ? file.size : start + chunkSize;
                fileReader.readAsArrayBuffer(blobSlice.call(file, start, end));
            }
            loadNext();
        }

        var uploadfile  = document.getElementById('fileinput')
        uploadfile.onchange = function(e){
            var file = this.files[0];
             if(!file) {
                alert('请选择文件!');
                return false;
            }
            get_filemd5sum(file)
        }
    </script>
   </body> 
</html>
/**
     * 获取文件的md5
     * @param filePath 文件地址
     * @param fileName 文件名
     * @return
     */
    public static String getFileMd5Value(String filePath, String fileName){
        File file = new File(filePath + File.separator + fileName);
        if(!file.exists() || !file.isFile()){
            return "";
        }
        byte[] buffer = new byte[2048];
        try {
            MessageDigest digest = MessageDigest.getInstance("MD5");
            FileInputStream in = new FileInputStream(file);
            while(true){
                int len = in.read(buffer,0,2048);
                if(len != -1){
                    digest.update(buffer, 0, len);
                }else{
                    break;
                }
            }
            in.close();
             
            byte[] md5Bytes  = digest.digest();
            StringBuffer hexValue = new StringBuffer();
            for (int i = 0; i < md5Bytes.length; i++) {
                int val = ((int) md5Bytes[i]) & 0xff;
                if (val < 16) {
                    hexValue.append("0");
                }
                hexValue.append(Integer.toHexString(val));
            }
            return hexValue.toString();
        } catch (Exception e) {
            e.printStackTrace();
            return "";
        }
    }
    
    public static void main(String[] args) {
        System.out.println(Snippet.getFileMd5Value("C:\Users\Administrator\Desktop", "test.txt"));
    }
原文地址:https://www.cnblogs.com/kawhileonardfans/p/10966245.html