通过了解更新文件来上载文件并防止重复

时间:2013-06-26 00:10:17

标签: 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 which 
  means I need to update the file in the FS.

我忽略文件名作为了解文件是否已存在的方法。文件名不能被视为唯一。一个例子是,一些摄像机使用一段时间后翻转的增量编号命名照片。 通过Web浏览器上载文件时,将屏蔽源文件结构。例如。 C:\Users\Drive\File\Uploaded\From。所以我不能用它来弄清楚文件是否已经上传。

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

Microsoft Word文档创建了一个挑战,因为Word会在每次保存时重新生成文件。

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

1 个答案:

答案 0 :(得分:1)

我首先要通过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(新的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));
        }

理想情况下,您可以在上传文件时保存此哈希,因为重新计算非常激烈。