【发布时间】: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?我们还必须根据内容找出重复项。现在,如果一个文件具有相同的名称,我们说它是重复的。但是可能存在文件名,甚至文件大小都可以相同的情况。因此,我们需要根据内容唯一标识文件,如果相同,则抛出消息“文件重复”。
标签: ruby-on-rails ruby file filenames filesize