【问题标题】:Rails: Preventing Duplicate Photo Uploads with Paperclip?Rails:使用回形针防止重复上传照片?
【发布时间】:2010-03-16 20:56:09
【问题描述】:

如果用户尝试使用 Paperclip 将同一张照片两次上传到 Rails 应用程序,是否会引发验证错误?回形针似乎不提供此功能...

我正在使用 Rails 2.3.5 和 Paperclip(显然)。


解决方案:(或至少其中之一)

根据 Beerlington 的建议,我决定进行 MD5 校验和比较:

class Photo < ActiveRecord::Base
  #...
  has_attached_file :image #, ...

  before_validation_on_create :generate_md5_checksum
  validate :unique_photo
  #...

  def generate_md5_checksum
    self.md5_checksum = Digest::MD5.hexdigest(image.to_file.read)
  end

  def unique_photo
    photo_digest = self.md5_checksum
    errors.add_to_base "You have already uploaded that file!" unless User.find(self.user_id).photos.find_by_md5_checksum(photo_digest).nil?
  end

  # ...
end

然后我刚刚在我的photos 表中添加了一个名为md5_checksum 的列,瞧!现在,如果您尝试上传同一张照片,我的应用会引发验证错误!

不知道这是多么高效/低效,所以欢迎重构!

谢谢!

【问题讨论】:

  • 如果您在网上查看图像比较算法,您会发现一些 dll 文件(由 Bolide 软件发布)可以判断两个图像是否相同,但在 rails 应用程序中用处不大.您可以尝试编写自己的算法,尽管我不知道这是否值得。

标签: ruby-on-rails paperclip


【解决方案1】:

对图像文件进行 MD5 处理怎么样?如果是完全相同的文件,则两张图片的 MD5 哈希值将相同。

【讨论】:

  • 这里小心!您正在对 one 二进制表示进行指纹识别。通常有数百万个二进制文件会在计算机屏幕上显示完全相同。从白痴开始:我只是通过在照片编辑软件中打开和关闭文件来更改图像(元数据更改)。对于恶意:只需更改一些元数据,或在末尾添加一些字节(大多数软件会忽略)或稍微调整大小或重新采样,图像就可以一次又一次地上传。
【解决方案2】:

对于其他尝试这样做的人。 Paperclip 现在内置了 md5 散列。如果您的模型中有 [attachment]_fingerprint,则回形针将使用 MD5 填充它。

由于我已经有一个名为 hash_value 的列,所以我创建了一个名为指纹的“虚拟”属性

#Virtual attribute to have paperclip generate the md5
def picture_fingerprint
  self.hash_value
end

def picture_fingerprint=(md5Hash)
  self.hash_value=md5Hash
end

而且,使用 rails3,使用 sexy_validations,我可以简单地将其添加到我的模型顶部,以确保 hash_value 在保存模型之前是唯一的:

validates :hash_value, :uniqueness => { :message => "Image has already been uploaded." }

【讨论】:

    【解决方案3】:

    当您的图片修改了 EXIF 元数据时,您可能会遇到问题。这发生在我身上,我必须提取像素值并从中计算 MD5,以忽略 Wordpress 等所做的更改。您可以在我们的博客上阅读它:http://www.amberbit.com/blog/2013/12/20/similar-images-detection-in-ruby-with-phash/ 但本质上您想从中获取像素数据使用一些工具(如 RMagick)生成图像,将其连接到字符串,然后从中计算 MD5。

    【讨论】:

      【解决方案4】:

      正如斯蒂芬所说,您最大的问题是如何确定文件是否重复,对此没有明确的答案。

      如果这些照片是用数码相机拍摄的,您可能需要比较 EXIF 数据。如果 EXIF 数据匹配,则照片很可能是重复的。如果它是重复的,那么您可以通知用户这一点。不过,您必须首先接受上传,以便检查 EXIF 数据。

      我应该提到 EXIFR 是一个很好的用于检查 EXIF 数据的 ruby​​ gem。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-04-24
        • 1970-01-01
        • 2011-01-03
        • 2013-05-06
        • 2013-11-09
        • 1970-01-01
        • 2011-01-08
        • 1970-01-01
        相关资源
        最近更新 更多