Rails: Предотвращение дублирования загрузки фотографий с помощью скрепки? - PullRequest
10 голосов
/ 16 марта 2010

Есть ли возможность выдать ошибку проверки, если пользователь пытается дважды загрузить одну и ту же фотографию в приложение Rails с помощью Paperclip? Скрепка, кажется, не предлагает эту функциональность ...

Я использую Rails 2.3.5 и Скрепка (очевидно).


РЕШЕНИЕ: (или хотя бы один из них)

Используя предложение Берлингтона, я решил пойти по сравнению с контрольной суммой 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, и вуаля! Теперь мое приложение выдает ошибку проверки, если вы пытаетесь загрузить ту же фотографию!

Понятия не имею, насколько это эффективно / неэффективно, поэтому рефакторинг приветствуется!

Спасибо!

Ответы [ 4 ]

11 голосов
/ 17 марта 2010

Как насчет выполнения MD5 для файла изображения? Если это один и тот же файл, хеш MD5 будет одинаковым для обоих изображений.

10 голосов
/ 16 сентября 2011

Для всех, кто пытается это сделать. В Paperclip теперь встроено хеширование md5. Если у вас есть [attachment] _fingerprint в вашей модели, paperclip заполняет это 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." }
3 голосов
/ 29 декабря 2013

Вы можете столкнуться с проблемой, если ваши изображения имеют измененные метаданные EXIF. Это случилось со мной, и мне пришлось извлечь значения пикселей и вычислить из них MD5, чтобы игнорировать изменения, сделанные Wordpress и т. Д. Вы можете прочитать об этом в нашем блоге: http://www.amberbit.com/blog/2013/12/20/similar-images-detection-in-ruby-with-phash/, но по сути вы хотите получить пиксель данные из изображения с помощью какого-либо инструмента (например, RMagick), объединить их в строку и вычислить из этого MD5.

0 голосов
/ 17 марта 2010

Как указал Стивен, ваша самая большая проблема заключается в том, как определить, является ли файл дубликатом, и нет четкого ответа на этот вопрос.

Если это фотографии, сделанные цифровой камерой, вам нужно сравнить данные EXIF. Если данные EXIF ​​совпадают, то фотография, скорее всего, является дубликатом. Если это дубликат, вы можете сообщить об этом пользователю. Вы должны будете сначала принять загрузку, чтобы проверить данные EXIF.

Я должен упомянуть, что EXIFR - это хороший рубиновый камень для изучения данных EXIF.

...