秒传的初步原理:文件上传过程中可以通过存储文件的路径和对应的MD5的摘要。如果有新文件上传,则先检查库里面有没有已经存在的MD5摘要,如果有则无需上传直接返回相同MD5摘要文件对应的路径
MD5代码封装:
using System.IO;
using System.Security.Cryptography;
using System.Text;
namespace Services
{
/// <summary>
/// 不可逆加密
/// 1 防止被篡改
/// 2 防止明文存储
/// 3 防止抵赖,数字签名
/// </summary>
public class MD5Encrypt
{
#region MD5摘要
/// <summary>
/// 获取文件的MD5摘要
/// </summary>
/// <param name="fileName"></param>
/// <returns></returns>
public static string AbstractFile(string fileName)
{
using (FileStream file = new FileStream(fileName, FileMode.Open))
{
return AbstractFile(file);
}
}
/// <summary>
/// 根据stream获取文件摘要
/// </summary>
/// <param name="stream"></param>
/// <returns></returns>
public static string AbstractFile(Stream stream)
{
MD5 md5 = new MD5CryptoServiceProvider();
byte[] retVal = md5.ComputeHash(stream);
StringBuilder sb = new StringBuilder();
for (int i = 0; i < retVal.Length; i++)
{
sb.Append(retVal[i].ToString("x2"));
}
return sb.ToString();
}
#endregion
}
}
调用端代码:
class Program
{
static void Main(string[] args)
{
string md5Abstract1 = MD5Encrypt.AbstractFile(@"D:\我的资料\客厅.jpg");
string md5Abstract2 = MD5Encrypt.AbstractFile(@"D:\我的资料\客厅 - 副本.jpg");
Console.WriteLine($"md5Abstract1={md5Abstract1},md5Abstract2={md5Abstract2},两文件是否相同:{md5Abstract1.Equals(md5Abstract2)}");
//实际过程中可以通过存储文件的路径和对应的MD5的摘要。如果有新文件上传,
//则先检查库里面有没有已经存在的MD5摘要,如果有则无需上传直接返回相同MD5摘要文件对应的路径
Console.ReadKey();
}
}