2010-03-16 16 views
9

क्या कोई उपयोगकर्ता सत्यापन सत्यापन फेंकने के लिए वैसे भी है यदि कोई उपयोगकर्ता पेपरक्लिप का उपयोग करके रेल ऐप में दो बार एक ही फोटो अपलोड करने का प्रयास करता है? पेपरक्लिप इस कार्यक्षमता की पेशकश नहीं कर रहा है ...रेल: पेपरक्लिप के साथ डुप्लिकेट फोटो अपलोड को रोकना?

मैं रेल 2.3.5 और Paperclip (स्पष्ट रूप से) का उपयोग कर रहा हूं।


समाधान:

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 

तो मैं बस के लिए एक स्तंभ कहा: (या उनमें से एक, कम से कम)

Beerlington के सुझाव का उपयोग करना, मैं एक MD5 चेकसम तुलना के साथ जाने का फैसला किया मेरी photos तालिका md5_checksum, और वॉयला कहा जाता है! यदि आप एक ही फोटो अपलोड करने का प्रयास करते हैं तो अब मेरा ऐप एक सत्यापन त्रुटि फेंकता है!

कोई विचार नहीं कि यह कितना कुशल/अक्षम है, इसलिए रीफैक्टरिंग का स्वागत है!

धन्यवाद!

+0

यदि आप छवि तुलना एल्गोरिदम के लिए ऑनलाइन देखते हैं तो आपको कुछ डीएलएल फाइलें मिलेंगी (बोलाइड सॉफ़्टवेयर द्वारा जारी) जो बता सकती है कि दो छवियां समान हैं लेकिन यह रेल ऐप के अंदर अधिक उपयोग नहीं होगी। आप संभवतः अपना स्वयं का अलोग्राम लिख सकते हैं और लिख सकते हैं हालांकि मुझे नहीं पता कि यह समस्या के लायक होगा या नहीं। – stephenmurdoch

उत्तर

10

छवि फ़ाइल पर MD5 करने के बारे में क्या? यदि यह एक ही फाइल है, तो एमडी 5 हैश दोनों छवियों के लिए समान होगा।

+0

यह एक आकर्षण की तरह काम करता है! धन्यवाद; इस बारे में नहीं सोचा था! – neezer

+1

यहां पर सावधान रहें! आप फिंगरप्रिंटिंग _one_ बाइनरी प्रस्तुति दे रहे हैं। आम तौर पर लाखों बाइनरी फाइलें होती हैं जो एक कंप्यूटर स्क्रीन पर बिल्कुल दिखाई देगी। बेवकूफ से: मैंने फोटो संपादन सॉफ्टवेयर में फ़ाइल खोलने और बंद करके छवियों को बदल दिया है (मेटाडाटा परिवर्तन)। दुर्भावनापूर्ण के लिए: बस कुछ मेटाडेटा बदलें, या अंत में कुछ बाइट्स जोड़ें (जो अधिकांश सॉफ़्टवेयर द्वारा अनदेखा हो जाता है) या थोड़ा आकार बदलें या फिर से आकार दें, और छवि को बार-बार अपलोड किया जा सकता है। –

0

जैसा स्टीफन ने इंगित किया है, आपकी सबसे बड़ी समस्या यह निर्धारित करने के लिए है कि कोई फ़ाइल डुप्लिकेट है या नहीं, और इसके लिए कोई स्पष्ट उत्तर नहीं है।

यदि ये डिजिटल कैमरे से ली गई तस्वीरें हैं, तो आप EXIF ​​डेटा की तुलना करना चाहेंगे। यदि EXIF ​​डेटा मेल खाता है तो फ़ोटो की संभावना अधिक डुप्लीकेट होती है। यदि यह एक डुप्लिकेट है तो आप इसके उपयोगकर्ता को सूचित कर सकते हैं। आपको शुरुआत में अपलोड स्वीकार करना होगा, हालांकि आप EXIF ​​डेटा की जांच करते हैं।

मुझे यह उल्लेख करना चाहिए कि EXIFR EXIF ​​डेटा की जांच के लिए एक अच्छा रूबी मणि है।

10

किसी और के लिए ऐसा करने की कोशिश कर रहा है। पेपरक्लिप में अब एमडी 5 हैशिंग बनाया गया है। यदि आपके मॉडल में [अटैचमेंट] _ फ़िंगरप्रिंट है, तो पेपरक्लिप एमडी 5 के साथ इसे पॉप्युलेट करेगा।

जब से मैं पहले से ही एक स्तंभ नामित hash_value था, मैं एक 'वर्चुअल' विशेषता फिंगरप्रिंट

#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

आप एक समस्या है जब आपकी छवियों EXIF ​​मेटाडेटा में संशोधन किया है हो सकती हैं। यह मेरे साथ हुआ, और मुझे वर्डप्रेस आदि द्वारा किए गए परिवर्तनों को अनदेखा करने के लिए पिक्सेल मान निकालना और उनमें से MD5s की गणना करना था। आप इसके बारे में हमारे ब्लॉग पर पढ़ सकते हैं: http://www.amberbit.com/blog/2013/12/20/similar-images-detection-in-ruby-with-phash/ लेकिन अनिवार्य रूप से आप पिक्सेल डेटा को छवि से बाहर करना चाहते हैं कुछ टूल (जैसे RMagick), इसे स्ट्रिंग करने के लिए संयोजित करें, और उसमें से MD5 की गणना करें।

संबंधित मुद्दे