JAVA求文件的MD5和context-MD5

JAVA求文件的MD5和context-MD5

最近在使用阿里云的oss,发现JAVA求的文件MD5和oss求的MD5不同。
同一个测试文件,java代码:

import java.io.File;
import java.io.FileInputStream;
import java.security.DigestInputStream;
import java.security.MessageDigest;

import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;

import org.apache.commons.codec.binary.Base64;

public class FileMd5 {
	public static void main(String[] args) {
		File file = new File("D:\\oss\\fileTest.txt");
		String path = "D:\\oss\\fileTest.txt";
		if(file.exists()) {
			try {
				//获取文件context-MD5
				FileInputStream fis = new FileInputStream(path);
				String md5 = DigestUtils.md5Hex(IOUtils.toByteArray(fis));
				IOUtils.closeQuietly(fis);
				System.out.println("MD5:" + md5);							    
			} catch (Exception e) {
				// TODO: handle exception
				e.printStackTrace();
			}
		}else {
			System.out.println("文件不存在~");
		}
	}
}

java求得MD5:c5e820e3b12c726c0ab457f7283977d3
在这里插入图片描述
使用oss求MD5:xegg47EscmwKtFf3KDl30w==
在这里插入图片描述
但是发现 java求的MD5 与oss的eTag值相同。查看oss相关文档了解到oss的md5实际上是context-MD5.
在这里插入图片描述
所以…现在问题变成了:java怎样求文件的context-MD5?
百度ing…

找到了有说用 Base64.encodeBase64String() 方法…试一下:

package com.dfe.e8800.business.dtjc.md5;

import java.io.File;
import java.io.FileInputStream;
import java.security.DigestInputStream;
import java.security.MessageDigest;

import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;

import org.apache.commons.codec.binary.Base64;

public class FileMd5 {
	public static void main(String[] args) {	
		File file = new File("D:\\oss\\fileTest.txt");
		String path = "D:\\oss\\fileTest.txt";
		if(file.exists()) {
			try {
				//获取文件context-MD5
				FileInputStream fis = new FileInputStream(path);
				String md5 = DigestUtils.md5Hex(IOUtils.toByteArray(fis));
				IOUtils.closeQuietly(fis);
				System.out.println("MD5:" + md5);
				
				String contextMd5 = Base64.encodeBase64String(md5.getBytes());
				System.out.println("contextMd5:"+contextMd5)		    
			} catch (Exception e) {
				// TODO: handle exception
				e.printStackTrace();
			}
		}else {
			System.out.println("文件不存在~");
		}
	}
}

context-MD5:YzVlODIwZTNiMTJjNzI2YzBhYjQ1N2Y3MjgzOTc3ZDM=,和oss的MD5还是不同。
在这里插入图片描述
然后找到一篇文章“HTTP Content-MD5 首部字段:编码的坑”
http://www.ituring.com.cn/article/74167

在这里插入图片描述
在这里插入图片描述
所以…修改后代码:

package com.dfe.e8800.business.dtjc.md5;

import java.io.File;
import java.io.FileInputStream;
import java.security.DigestInputStream;
import java.security.MessageDigest;

import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;

import org.apache.commons.codec.binary.Base64;

public class FileMd5 {
	public static void main(String[] args) {
		File file = new File("D:\\oss\\fileTest.txt");
		String path = "D:\\oss\\fileTest.txt";
		if(file.exists()) {
			try {
				//获取文件context-MD5
				FileInputStream fis = new FileInputStream(path);
				String md5 = DigestUtils.md5Hex(IOUtils.toByteArray(fis));
				IOUtils.closeQuietly(fis);
				System.out.println("MD5:" + md5);
				
				String contextMd5 = Base64.encodeBase64String(md5.getBytes());
				System.out.println("contextMd5:"+contextMd5);
				
				MessageDigest md = MessageDigest.getInstance("MD5");
				byte[] b = md.digest(FileUtils.readFileToByteArray(new File(path)));
				String ContextMd5 = Base64.encodeBase64String(b);
				System.out.println("context-Md5:"+ContextMd5);
				
			} catch (Exception e) {
				// TODO: handle exception
				e.printStackTrace();
			}
		}else {
			System.out.println("文件不存在~");
		}
	}
}

在这里插入图片描述
所求Context-MD5与oss的md5相同。

参考
JAVA中获取文件MD5值的四种方法
https://blog.youkuaiyun.com/sike_java/article/details/78538762
md5 计算content-MD5时好费劲
https://blog.youkuaiyun.com/u010321349/article/details/84864580
HTTP Content-MD5 首部字段:编码的坑
http://www.ituring.com.cn/article/74167

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值