秒传

秒传的初步原理:文件上传过程中可以通过存储文件的路径和对应的MD5的摘要。如果有新文件上传,则先检查库里面有没有已经存在的MD5摘要,如果有则无需上传直接返回相同MD5摘要文件对应的路径

MD5代码封装:

using System.IO;
using System.Security.Cryptography;
using System.Text;

namespace Services
{
    /// 
    /// 不可逆加密
    /// 1 防止被篡改
    /// 2 防止明文存储
    /// 3 防止抵赖,数字签名
    /// 
    public class MD5Encrypt
    {
        #region MD5摘要
        /// 
        /// 获取文件的MD5摘要
        /// 
        /// 
        /// 
        public static string AbstractFile(string fileName)
        {
            using (FileStream file = new FileStream(fileName, FileMode.Open))
            {
                return AbstractFile(file);
            }
        }

        /// 
        /// 根据stream获取文件摘要
        /// 
        /// 
        /// 
        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();
        }
    }

 

你可能感兴趣的:(工具类,文件上传)