获取文件MD5值

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

          文件MD5有啥用?

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

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

开始

1、HTML代码

<!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='width: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>

2、JAVA代码 

	/**
	 * 获取文件的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"));
	}

结束

结尾:仅供自己学习,记录问题和参考,若有带来误解和不便请见谅,共勉!

猜你喜欢

转载自blog.csdn.net/liguoqingxjxcc/article/details/81664245