Có cách nào để ném lỗi xác thực nếu người dùng cố tải lên cùng một ảnh hai lần lên ứng dụng Rails bằng Paperclip không? Paperclip dường như không cung cấp chức năng này ...Đường ray: Ngăn tải lên ảnh trùng lặp bằng kẹp giấy?
Tôi đang sử dụng Rails 2.3.5 và Paperclip (hiển nhiên).
GIẢI PHÁP: (hoặc một trong số họ, ít nhất)
Sử dụng gợi ý Beerlington, tôi quyết định đi với một sự so sánh MD5 Checksum:
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
Sau đó, tôi chỉ cần thêm một cột để bảng photos
của tôi có tên là md5_checksum
và thì đấy! Bây giờ ứng dụng của tôi ném lỗi xác thực nếu bạn cố gắng tải lên cùng một ảnh!
Không có ý tưởng về hiệu quả/không hiệu quả như thế nào, vì vậy hãy tiếp tục tái cấu trúc!
Cảm ơn!
nếu bạn xem trực tuyến thuật toán so sánh hình ảnh, bạn sẽ tìm thấy một số tệp dll (do phần mềm Bolide phát hành) có thể biết hai hình ảnh giống nhau nhưng không được sử dụng nhiều trong ứng dụng đường ray. Bạn có thể có thể thử và viết alogrithm của riêng bạn mặc dù tôi không biết nếu nó sẽ có giá trị rắc rối. – stephenmurdoch