在项目的开发资源开发中,测试发现一个问题:将资源上传到服务器上,提示已经上传成功,但是当打开这个文件时发现失败,由于各种原因资源已经毁坏。怎么样能保证资源的完整性,处理办法就是用MD5验证文件的完整性。
任何一个字符串或文件,无论是可执行程序、图像文件、临时文件或者其他任何类型的文件,也不管它体积多大,都有且只有一个独一无二的MD5信息码,并且如果这个文件被修改过,它的MD5码也将随之改变。
Message-Digest泛指字节串(Message)的Hash变换,就是把一个任意长度的字节串变换成一定长的大整数。注意这里说的是“字节串”而不是“字符串”,因为这种变换只与字节的值有关,与字符集或编码方式无关。
在Java中,java.security.MessageDigest (rt.jar中)已经定义了 MD5 的计算,所以我们只需要简单地调用即可得到 MD5 的128 位整数。然后将此 128 位计 16 个字节转换成 16 进制表示即可。

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;public class TestMD5Two {/*** 默认的密码字符串组合,用来将字节转换成 16 进制表示的字符,apache校验下载的文件的正确性用的就是默认的这个组合*/protected static char hexDigits[] = { '0', '1', '2', '3', '4', '5', '6','7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };protected static MessageDigest messagedigest = null;static {try {messagedigest = MessageDigest.getInstance("MD5");} catch (NoSuchAlgorithmException nsaex) {System.err.println(TestMD5Two.class.getName()+ "初始化失败,MessageDigest不支持MD5Util。");nsaex.printStackTrace();}}/*** 生成字符串的md5校验值* * @param s* @return*/public static String getMD5String(String s) {return getMD5String(s.getBytes());}/*** 判断字符串的md5校验码是否与一个已知的md5码相匹配* * @param password 要校验的字符串* @param md5PwdStr 已知的md5校验码* @return*/public static boolean checkPassword(String md5, String md5PwdStr) {return md5.equals(md5PwdStr);}/*** 生成文件的md5校验值* * @param file* @return* @throws IOException*/public static String getFileMD5String(File file) throws IOException {       InputStream fis;fis = new FileInputStream(file);byte[] buffer = new byte[1024];int numRead = 0;while ((numRead = fis.read(buffer)) > 0) {messagedigest.update(buffer, 0, numRead);}fis.close();return bufferToHex(messagedigest.digest());}public static String getMD5String(byte[] bytes) {messagedigest.update(bytes);return bufferToHex(messagedigest.digest());}private static String bufferToHex(byte bytes[]) {return bufferToHex(bytes, 0, bytes.length);}private static String bufferToHex(byte bytes[], int m, int n) {StringBuffer stringbuffer = new StringBuffer(2 * n);int k = m + n;for (int l = m; l < k; l++) {appendHexPair(bytes[l], stringbuffer);}return stringbuffer.toString();}private static void appendHexPair(byte bt, StringBuffer stringbuffer) {char c0 = hexDigits[(bt & 0xf0) >> 4];// 取字节中高 4 位的数字转换, >>> 为逻辑右移,将符号位一起右移,此处未发现两种符号有何不同 char c1 = hexDigits[bt & 0xf];// 取字节中低 4 位的数字转换 stringbuffer.append(c0);stringbuffer.append(c1);}public static void main(String[] args) throws IOException {long begin = System.currentTimeMillis();File file = new File("H:/12345.txt");String md5 = getFileMD5String(file);//文件名不同,内容相同;File file2 = new File("H:/12345(2).txt");String md52= getFileMD5String(file2);//文件名不同,内容不同;File file3 = new File("H:/12345(3).txt");String md53= getFileMD5String(file3);//测试压缩包File fileZip = new File("H:/1.zip");String md5Zip= getFileMD5String(fileZip);//测试压缩包File fileZip2 = new File("H:/2.zip");String md5Zip2= getFileMD5String(fileZip2);System.out.println("MD5:"+md5);System.out.println("MD5:"+md52);System.out.println("MD5:"+md53);System.out.println("MD5:"+md5Zip);System.out.println("MD5:"+md5Zip2);System.out.println("两个文件名不同,内同相同"+ checkPassword(md5, md52));System.out.println("文件名不同,内容不同"+ checkPassword(md5, md53));System.out.println("测试压缩包,内容不同"+ checkPassword(md5Zip, md5Zip2));long end = System.currentTimeMillis();System.out.println("md5:" + md5 + " time:" + ((end - begin) / 1000) + "s");}
}

用MD5验证上传文件的完整性相关推荐

  1. html5 如何实现客户端验证上传文件的大小

    在HTML 5中,现在可以在客户端进行文件上传时的校验了,比如用户选择文件后,可以 马上校验文件的大小和属性等.本文章向码农介绍html5 如何实现客户端验证上传文件的大小,感兴趣的码农可以参考一下. ...

  2. 如何上传html验证文件大小,html5 实现客户端验证上传文件的大小(简单实例)

    在HTML 5中,现在可以在客户端进行文件上传时的校验了,比如用户选择文件后,可以 马上校验文件的大小和属性等.本文章向码农介绍html5 如何实现客户端验证上传文件的大小,感兴趣的码农可以参考一下. ...

  3. 验证上传文件真实格式

    1 /// <summary> 2 /// 验证上传文件真实格式 3 /// </summary> 4 /// <param name="fileUpload& ...

  4. 为什么腾讯微云上传文件会显示服务器繁忙呢,API - 微云

    1. 接口说明 文件上传申请,成功会返回实际上传的地址. 根据申请上传返回的地址,组织数据上传. 1.1 URL OAuth2.0协议: https://graph.qq.com/weiyun/upl ...

  5. obs上传文件到服务器,obs上传文件到指定路径

    obs上传文件到指定路径 内容精选 换一换 需提前准备好OBS桶名.vi /opt/huawei/obsutil_adapter/obsutil_adapter.cfgbackup_path和back ...

  6. 获取当前按钮所在行的input_form表单的input上传文件

    在这次的一个小项目中用到了文件的上传,在之前我对form表单的认知还只是发送用户名和密码.行吧,既然用到了那就硬着头皮上咯. 使用 首先文件的上传需要一个type=file的input.它的意义就是上 ...

  7. php上传文件很慢的原因_PHP编码安全:上传文件安全

    一次性付费进群,长期免费索取教程,没有付费教程. 进微信群回复公众号:微信群:QQ群:460500587  教程列表 见微信公众号底部菜单 |  本文底部有推荐书籍  微信公众号:计算机与网络安全 I ...

  8. flask 接口上传文件_Flask干货:Flask数据交换——上传文件

    图 | 源网络文 | 5号程序员01 事情是这样的. 有一天五号程序员打算网购一盒巧克力送给自己的女朋友 想必女朋友收到礼物是这样的: 结果商家邮寄来的巧克力中夹着一张纸条: 害!你说气不气人,现在都 ...

  9. python flask上传文件_Python之利用Flask上传文件、Flask_RESTful

    Flask上传文件 回顾知识点form表单中,一旦涉及到上传文件就要就必须要有enctype属性,而且必须等于multipart/form-data.而且提交方式为'post',method = 'p ...

  10. 上传文件 java_JAVA文件的上传与访问

    /** * 各种文件上传与判断 * types 文件类型(1图片 2视频 3文件) */ @RequestMapping(method = RequestMethod.POST, path = &qu ...

最新文章

  1. Markdown编辑表格时如何输入竖线('|', pipe,vertical bar)
  2. iOS开发多线程篇—多线程简单介绍
  3. C专家编程-Chapter6 运行时数据结构(转)
  4. ssl提高组周六备考赛【2018.10.20】
  5. 阿里P8亲自教你!Activity的6大难点,你会几个?年薪50W
  6. 随笔:朋友圈扫街图有感(爱情)
  7. 双剑携手良师益友,学习机行业破局在望
  8. XenServer部署系列之05——虚拟机的创建及复制
  9. 交叉编译mpg321到MX27 ADS Rel3平台
  10. 关于:win远程桌面连接命令怎么用
  11. 计算机网络分层结构概述
  12. java访问邮箱 apache,关于apache common-mail发邮件,部分邮箱无法接收有关问题
  13. 实验2014052801:动态网页中的动态思想
  14. 大数据算法工程师知识点大全
  15. #新技能# ps 简单抠图【持续更新】
  16. 防止前端重复提交表单
  17. RCWL-0516微波雷达模块检测人体移动(发光二极管)
  18. myeclipse17创建Web、Maven项目
  19. JSP网上二手交易商城
  20. 森林防火综合解决方案

热门文章

  1. BZOJ3420[POI2013]Triumphal archBZOJ5174[Jsoi2013]哈利波特与死亡圣器——树形DP+二分答案...
  2. ping 命令的用法大全(图文详解)
  3. 电脑不允许被PING的解决办法
  4. 计算机无法u盘启动,电脑无法从u盘启动怎么办呢?
  5. ubuntu 20.04 设定固定IP地址碰到的坑
  6. 笔试必备:48道SQL练习题(Oracle为主)
  7. 如何实现 Android 短视频跨页面的流畅续播?
  8. directadmin php-fpm,centos7.5最新内核安装DirectAdmin面板
  9. Mysql第一天笔记02——安装Navicat
  10. xcode8插件管理工具