唯一标识具有相同名称和大小但内容不同的文件

时间:2017-07-01 03:03:24

标签: ruby-on-rails ruby file filenames filesize

我们的项目中有一个场景,其中有来自客户端的文件具有相同的文件名,有时文件大小也相同。目前,当我们上传文件时,我们正在使用数据库中的现有文件检查新文件名,如果有引用,我们将其标记为重复,并且根本不允许上传。但是现在我们需要在文件具有相同文件名时检查文件的内容。因此,我们需要找到一种解决方案,以根据内容区分这些文件。那么,我们如何有效地做到这一点 - 意味着如何做到这一点,甚至避免错误的机会?

  

Rails 3.1,Ruby 1.9.3

以下是我从网络参考中读取的一个选项。

require 'digest'
digest_value = Digest::MD5.base64digest(File.read( file_path ))

上面的行将读取传入文件的所有内容,并根据它生成一个唯一的哈希,对吧?然后我们可以用它来进行唯一的文件识别。但我们有超过500名用户同时以24/7模式工作,其中大多数将进行此操作。因此,如果传入的文件具有巨大的大小(> 25MB),那么摘要将花费更多的时间来读取整个内容,并且存在性能问题。那么,考虑到所有这些事实,什么可能是更好的解决方案?

1 个答案:

答案 0 :(得分:3)

我已经阅读了问题和评论,我不得不说你说的问题不是100%正确。您似乎需要识别相同的内容。期。尽管名称和大小是否相等。如果我错了,请纠正我,但您可能不希望允许用户更新同一文件的100个副本,因为用户在本地有100个副本,具有不同的名称。

到目前为止,这么好。我会使用以下方法。无论如何都不涉及文件名。文件大小可能有助于快速检查唯一性(大小不同因此文件肯定是不同的。)

然后人们可以通过即时“OK”响应允许上传。之后,后台服务器应运行Digest::MD5,将文件与已上传的所有文件进行比较。如果存在重复,则应删除该文件的新副本,但名称应保留在文件系统上,作为原始的符号链接。

通过这种方式,您不会让用户感到沮丧,让他们能够以不同的名称拥有所需数量的文件副本,同时保留最低级别的HDD音量。