Asp.net 上传文件并通过知道更新文件来防止重复

Asp.net 上传文件并通过知道更新文件来防止重复,asp.net,file-upload,xmlhttprequest,valums-file-uploader,Asp.net,File Upload,Xmlhttprequest,Valums File Uploader,在我们的系统中,当用户上传一个文件时,它存储在一个独特的文件系统结构中,并生成一个数据库记录。通过webbrowser通过XMLHttpRequest上传文件。然后,文件从临时上传区域移动到FS中 如何检测上传后的文件已存在于我的FS中? If the file uploaded is the same as one already uploaded. If the file is the same file, but the uploaded content has been updated

在我们的系统中,当用户上传一个文件时,它存储在一个独特的文件系统结构中,并生成一个数据库记录。通过webbrowser通过XMLHttpRequest上传文件。然后,文件从临时上传区域移动到FS中

如何检测上传后的文件已存在于我的FS中?

If the file uploaded is the same as one already uploaded.
If the file is the same file, but the uploaded content has been updated which 
  means I need to update the file in the FS.
我忽略文件名,以此来判断文件是否已经存在。文件名不能被认为是唯一的。一个例子是,一些相机使用在一段时间后滚动的递增数字命名照片。 通过web浏览器上载文件时,源文件结构将被屏蔽。例如,
C:\Users\Drive\File\upload\From
。所以我不能用这个来判断文件是否已经上传了

我如何知道上传的文件已经存在,因为它的内容是相同的。或者它存在,但因为上传的文件已被更改,所以我可以只更新文件

Microsoft Word文档在Word每次保存时都会重新生成文件,这给Word带来了挑战


在用户自行重命名文件的情况下,我可以说运气不好。

我会首先通过SHA哈希查找相同的文件。您可以使用类似的方法获取与新上载的文件具有相同哈希的文件列表,然后采取一些操作

仅举一个获取新文件哈希值的示例:

string newfile;
    using(FileStream fs = new FileStream(   string newfile;
    using(FileStream fs = new FileStream("C:\\Users\\Drive\\File\\Uploaded\\From\\newfile.txt", FileMode.Open))
    {
        using (System.Security.Cryptography.SHA1Managed sha1 = new System.Security.Cryptography.SHA1Managed())
        {
            newfile = BitConverter.ToString(sha1.ComputeHash(fs));
        }
    }   
这将遍历所有文件,并获取文件名和哈希的列表

var allfiles = Directory.GetFiles(@"var allfiles = Directory.GetFiles(@"C:\Users\Drive\File\Uploaded\From\", "*.*")
        .Select(
            f => new
                     {
                         FileName = f,
                         FileHash = new System.Security.Cryptography.SHA1Managed()
                                                            .ComputeHash(new FileStream(f, 
                                                                             FileMode.Open, 
                                                                             FileAccess.Read))
                     })       
        .ToList();

        foreach(var fi in allfiles){
        if(newfile == BitConverter.ToString(fi.FileHash))
            Console.WriteLine("Match!!!");
        Console.WriteLine(fi.FileName + ' ' + BitConverter.ToString(fi.FileHash));
        }
}“,”) .选择( f=>新的 { FileName=f, FileHash=new System.Security.Cryptography.SHA1Managed() .ComputeHash(新文件流), FileMode.Open, FileAccess.Read) })
.ToList()

这将循环遍历所有这些对象,并查找与新对象的匹配项

        foreach(var fi in allfiles){
        if(newfile == BitConverter.ToString(fi.FileHash))
            Console.WriteLine("Match!!!");
        Console.WriteLine(fi.FileName + ' ' + BitConverter.ToString(fi.FileHash));
        }

理想情况下,当文件上载时,您可以保存此哈希,因为重新计算的工作量非常大。

是的,这将阻止未更改的文件(这是两次上载同一文件)。我仍在寻找一种方法来识别已更改的文件并对其进行更新(这是上载文件,在本地更改,再次上载)。我能想到的唯一方法是让你的上传页面传递他们正在覆盖的文件的一些唯一ID。看起来我只能在文件未更改的情况下防止重复。谢谢你的示例。