唯一标识名称和大小相同但内容不同的文件
Posted
技术标签:
【中文标题】唯一标识名称和大小相同但内容不同的文件【英文标题】:Uniquely identify files with same name and size but with different contents 【发布时间】:2017-07-01 03:03:23 【问题描述】:我们的项目中有一个场景,其中来自客户端的文件具有相同的文件名,有时也具有相同的文件大小。目前,当我们上传文件时,我们正在使用数据库中的现有文件检查新文件名,如果有引用,我们将其标记为重复,根本不允许上传。但是现在我们有一个要求,当它们具有相同的文件名时检查文件的内容。所以我们需要找到一种解决方案来根据内容区分这些文件。那么,我们如何有效地做到这一点——意味着如何做到这一点,甚至避免一分钟的错误机会?
Rails 3.1、Ruby 1.9.3
以下是我从网络参考中阅读的一个选项。
require 'digest'
digest_value = Digest::MD5.base64digest(File.read( file_path ))
上面的行会读取传入文件的所有内容,并根据它生成一个唯一的哈希值,对吧?然后我们可以将它用于唯一的文件识别。但是我们有超过 500 名用户同时在 24/7 模式下工作,他们中的大多数人都将执行此操作。因此,如果传入文件的大小很大(> 25MB),那么 Digest 将花费更多时间来读取整个内容,从而导致性能问题。那么,考虑到所有这些事实,有什么更好的解决方案呢?
【问题讨论】:
为什么不给每个上传的文件一个唯一的、生成的 id,独立于它的名称、类型或内容? @maxpleaner:随机 ID?我们还必须根据内容找出重复项。现在,如果一个文件具有相同的名称,我们说它是重复的。但是可能存在文件名,甚至文件大小都可以相同的情况。因此,我们需要根据内容唯一标识文件,如果相同,则抛出消息“文件重复”。 【参考方案1】:我已经阅读了问题和 cmets,我不得不说你的问题不是 100% 正确的。看来您需要的是识别相同的内容。时期。不管名称和大小是否相等。如果我错了,请纠正我,但您可能不想让用户更新同一文件的 100 个副本,因为用户在本地拥有 100 个不同名称的副本。
到目前为止,一切都很好。我会使用以下方法。无论如何都不涉及文件名。文件大小可能有助于快速检查唯一性(大小不同,因此文件肯定不同。)
然后可能会允许上传即时“OK”响应。之后,后台服务器应该运行Digest::MD5
,将文件与所有已上传的文件进行比较。如果有重复,则应删除文件的新副本,但名称应保留在文件系统上,作为原始文件的符号链接。
这样您就不会让用户感到沮丧,让他们能够以不同的名称拥有任意数量的文件副本,同时将 HDD 卷保持在尽可能低的级别。
【讨论】:
感谢您的见解。以您对我问题的看法,我认为您的回答似乎很有效!但是,让我给你详细解释一下。用户一次上传一个文件,我们需要使用现有文件(数据库)验证新文件。仅当文件名相似时才检查内容,如果文件名相似,我们可以检查其大小以区分它。但相比大小,内容检查会更准确。我根本不想上传重复的文件。此外,如果 2 个文件具有不同的名称,我们不需要检查内容。以上是关于唯一标识名称和大小相同但内容不同的文件的主要内容,如果未能解决你的问题,请参考以下文章