【发布时间】: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 应用程序中用处不大.您可以尝试编写自己的算法,尽管我不知道这是否值得。