Там должен так или иначе бросить ошибку проверки, если пользователь пытается загрузить ту же фотографию дважды на приложение для направляющих с помощью Скрепки? Скрепка, кажется, не предлагает эту функциональность...
Я использую направляющие 2.3.5 и Скрепку (очевидно).
РЕШЕНИЕ: (или один из них, по крайней мере)
Используя предложение 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
, и вуаля! Теперь мое приложение бросает ошибку проверки, при попытке загрузить ту же фотографию!
Никакая идея, насколько эффективный/неэффективный это, таким образом, приветствие рефакторинга!
Спасибо!
Как насчет того, чтобы сделать MD5 для файла изображения? Если это один и тот же файл, хэш MD5 будет одинаковым для обоих изображений.
Как указал Стивен, ваша самая большая проблема - как определить, является ли файл дубликатом, и на этот вопрос нет четкого ответа.
Если это фотографии, сделанные цифровой камерой, вы можете сравнить данные EXIF. Если данные EXIF совпадают, фотография, скорее всего, является дубликатом. Если это дубликат, вы можете сообщить об этом пользователю. Однако сначала вам нужно будет принять загрузку, чтобы проверить данные EXIF.
Я должен упомянуть, что EXIFR - хороший рубиновый драгоценный камень для исследования данных EXIF.