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