【问题标题】:Uploading files and preventing duplicates by knowing to update the file通过知道更新文件来上传文件并防止重复
【发布时间】:2013-06-26 08:55:17
【问题描述】:

在我们的系统中,当用户上传文件时,它会存储在唯一的文件系统结构中并生成数据库记录。一个文件是通过网络浏览器通过 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.

我忽略了文件名,以此来了解文件是否已经存在。文件名不能被认为是唯一的。一个例子是,一些相机使用在一段时间后滚动的增量编号来命名照片。 通过网络浏览器上传文件时,源文件结构被屏蔽。例如。 C:\Users\Drive\File\Uploaded\From。所以我不能用它来确定文件是否已经上传。

我怎么知道上传的文件已经存在,因为它的内容是一样的。或者它存在但是因为上传的文件已经改变,所以我可以更新文件?

Microsoft Word 文档会带来挑战,因为 Word 会在每次保存时重新生成文件。

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

【问题讨论】:

    标签: asp.net file-upload xmlhttprequest valums-file-uploader


    【解决方案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 => 新的 { 文件名 = f, FileHash = new System.Security.Cryptography.SHA1Managed() .ComputeHash(新文件流(f, 文件模式。打开, 文件访问。读取)) })
    .ToList();

    这会遍历它们并寻找与新匹配的匹配项。

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

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

    【讨论】:

    • 是的,这将阻止未更改的文件(即,两次上传相同的文件)。我仍在寻找一种方法来识别已更改的文件并对其进行更新(这是上传文件,在本地更改,然后再次上传)。
    • 我能想到的唯一方法是让您的上传者页面传递他们正在覆盖的文件的一些唯一 ID。
    • 看起来我只能在文件没有更改的情况下防止重复。谢谢你的例子。
    猜你喜欢
    • 1970-01-01
    • 2015-01-29
    • 1970-01-01
    • 2016-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-20
    • 1970-01-01
    相关资源
    最近更新 更多