在将文件保存到机器之前检查MD5

时间:2017-09-13 10:06:34

标签: c# .net md5

我想检查MD5哈希而不保存它,

检查它是否已存在 我已经尝试过下面这段代码,但如果它尚未保存,它就不会计算文件的MD5。

所以我正在考虑在字节数组中填充文件,然后获取该字节数组MD5但这将使我在文件中没有字节。

有什么建议吗?这是我的代码

public void ProcessRequest(HttpContext context)
{
    if (context.Request.Files.Count > 0)
    {
        HttpFileCollection files = context.Request.Files;
        for (int i = 0; i < files.Count; i++)
        {
            HttpPostedFile file = files[i];
            string ServerPath = context.Server.MapPath("~/uploads/" + file.FileName);
            string Name = file.FileName;
            string MD5 = GetMD5(ServerPath);
            int Size = file.ContentLength;
            string type = file.ContentType;
            file.SaveAs(ServerPath);   
        }
    }
}

这是getMD5方法

public string GetMD5(string fileName)
{
    try
    {
        using (var md5 = MD5.Create())
        {
            using (var stream = File.OpenRead(fileName))
            {
                string Hash = BitConverter.ToString(md5.ComputeHash(stream)).Replace("-", "");
                     return Hash;
            }
        }
    }
    catch (Exception ex)
    {
        throw ex;
    }
}

2 个答案:

答案 0 :(得分:1)

由于此处的瓶颈是下载,因此在检查哈希之前不保存文件没有任何实际优势。你可能想要做的是下载到你的临时文件夹,然后最终自己删除它,或者如果不需要的话让操作系统清理它。

检查此答案,了解有关如何使用临时文件夹和临时文件的信息:Writing File to Temp Folder

一个更复杂的选项是在存储文件的同一服务器上托管页面并让它计算MD5:这样您就可以在下载之前检查MD5。否则,由于散列是组成文件的物理字节的函数,因此您需要整个文件(已下载或存储内存)来计算它。

答案 1 :(得分:1)

您可以使用InputStream课程中的HttpPostedFile属性。 要计算哈希值,请使用ComputeHash类的HashAlgorithm方法。

public void ProcessRequest(HttpContext context)
{
    if (context.Request.Files.Count > 0)
    {
        HttpFileCollection files = context.Request.Files;
        for (int i = 0; i < files.Count; i++)
        {
            HttpPostedFile file = files[i];
            var hasAlg=HashAlgorithm.Create("MD5");
            var MD5= hasAlg.ComputeHash(file.InputStream);

        }

    }
}