正确的计算方式:
标准中定义的算法简单点说就是:
1. 先计算MD5加密的二进制数组(128位)。
2. 再对这个二进制进行base64编码(而不是对32位字符串编码)。
JAVA代码示例
public static void main(String[] args) { System.out.println("结果:" + getStringContentMD5("D:/无微信“轻流产品介绍”.pdf")); } /*** * 计算字符串的Content-MD5 * @param str 文件路径 * @return */ public static String getStringContentMD5(String str) { // 获取文件MD5的二进制数组(128位) byte[] bytes = getFileMD5Bytes1282(str); // 对文件MD5的二进制数组进行base64编码 return new String(Base64.encodeBase64(bytes)); } /*** * 获取文件MD5-二进制数组(128位) * * @param filePath * @return * @throws IOException */ public static byte[] getFileMD5Bytes1282(String filePath) { FileInputStream fis = null; byte[] md5Bytes = null; try { File file = new File(filePath); fis = new FileInputStream(file); MessageDigest md5 = MessageDigest.getInstance("MD5"); byte[] buffer = new byte[1024]; int length = -1; while ((length = fis.read(buffer, 0, 1024)) != -1) { md5.update(buffer, 0, length); } md5Bytes = md5.digest(); fis.close(); } catch (FileNotFoundException e) { System.out.println(e.getMessage()); e.printStackTrace(); } catch (NoSuchAlgorithmException e) { System.out.println(e.getMessage()); e.printStackTrace(); } catch (IOException e) { System.out.println(e.getMessage()); e.printStackTrace(); } return md5Bytes; }
PHP代码示例
$contentBase64Md5 = getContentBase64Md5($filePath); function getContentBase64Md5($filePath){ //获取文件MD5的128位二进制数组 $md5file = md5_file($filePath,true); //计算文件的Content-MD5 $contentBase64Md5 = base64_encode($md5file); echo ("contentBase64Md5=".$contentBase64Md5); return $contentBase64Md5; }
.NET请求示例
public static string GetContentMD5FromFile(string filePath) { string ContentMD5 = null; try { FileStream file = new FileStream(filePath, FileMode.Open, FileAccess.Read); System.Security.Cryptography.MD5 md5 = new System.Security.Cryptography.MD5CryptoServiceProvider(); // 先计算出上传内容的MD5,其值是一个128位(128 bit)的二进制数组 byte[] retVal = md5.ComputeHash(file); file.Close(); // 再对这个二进制数组进行base64编码 ContentMD5 = Convert.ToBase64String(retVal).ToString(); MessageBox.Show("MD5:" + ContentMD5); return ContentMD5; } catch (Exception ex) { MessageBox.Show("错误信息", "计算文件的Content-MD5值时发生异常:" + ex.Message); return ContentMD5; } }