读取文件的md5值
阿里云这么干的
public static string ComputeContentMd5 (Stream input, long partSize) { using (MD5 mD = MD5.Create ()) { long position = input.Position; PartialWrapperStream inputStream = new PartialWrapperStream (input, partSize); byte[] inArray = mD.ComputeHash (inputStream); input.Seek (position, SeekOrigin.Begin); return Convert.ToBase64String (inArray); } }
webuploader上传组件获取文件md5值是这么干的,详见这里:https://codesandbox.io/s/jl3eq?file=/src/App.tsx:407-1009
import CryptoMD5 from "crypto-js/md5";
import CryptoLatin1Encoder from "crypto-js/enc-latin1";
import CryptoBase64Encoder from "crypto-js/enc-base64";
function handleUploadClick(e: React.ChangeEvent<HTMLInputElement>) { if (!e.target.files || e.target.files.length === 0) { return; } const selectedFile = e.target.files[0]; setFile(selectedFile); const reader = new FileReader(); reader.readAsBinaryString(selectedFile); reader.onloadend = (e) => { // Calculate md5 by using CryptoJS. const gotMD5 = CryptoMD5( CryptoLatin1Encoder.parse(e.target!.result as string) ); setHexMD5(gotMD5.toString()); // hex setBase64MD5(gotMD5.toString(CryptoBase64Encoder)); // base64 }; }
转换成c#是这么干的
public static string GetMD5HashFromFile(string fileName) { try { FileStream file = new FileStream(fileName, System.IO.FileMode.Open); MD5 md5 = new MD5CryptoServiceProvider(); byte[] retVal = md5.ComputeHash(file); file.Close(); StringBuilder sb = new StringBuilder(); for (int i = 0; i < retVal.Length; i++) { sb.Append(retVal[i].ToString("x2")); } return sb.ToString(); } catch (Exception ex) { throw new Exception("GetMD5HashFromFile() fail,error:" + ex.Message); } }
所以将js获取到的md5转换为阿里云md5格式如下:
/// <summary> /// 将webuploader上传组件获取到的文件md5值转换为阿里云md5格式 /// </summary> /// <param name="jsMd5"></param> /// <returns></returns> public static string ToAliMd5Format(string jsMd5) { //把md5字符串每两个一组转换成byte[]格式 int chunkSize = 2; var hashValues = Enumerable.Range(0, jsMd5.Length / chunkSize) .Select(i => jsMd5.Substring(i * chunkSize, chunkSize)).Select(x => { return Convert.ToByte(x, 16); }).ToArray(); return Convert.ToBase64String(hashValues); }