Rails:使用Paperclip防止重复的照片上传?

如果用户尝试使用Paperclip将同一张照片两次上传到Rails应用程序,是否仍然会抛出validation错误? Paperclip似乎没有提供此function……

我正在使用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的列,瞧! 现在,如果您尝试上传同一张照片,我的应用会抛出validation错误!

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

谢谢!

怎么在图像文件上做MD5? 如果它是完全相同的文件,则两个图像的MD5哈希值相同。

对于任何试图这样做的人。 Paperclip现在内置了md5哈希。如果你的模型中有[attachment] _fingerprint,回形针将用MD5填充。

由于我已经有一个名为hash_value的列,因此我创建了一个名为fingerprint的“虚拟”属性

 #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." } 

当您的图像修改了EXIF元数据时,您可能会遇到问题。 这发生在我身上,我不得不提取像素值并从中计算MD5,忽略Wordpress等所做的更改。您可以在我们的博客上阅读: http : //www.amberbit.com/blog/2013/ 12/20 /类似图像 – 检测在ruby与phash /但基本上你想用一些工具(如RMagick)从图像中获取像素数据,将其连接到字符串,并从中计算MD5。

正如斯蒂芬所说,你最大的问题是如何确定一个文件是否重复,并且没有明确的答案。

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

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