2011-09-22 7 views
7

मैं 1 एकाधिक प्रकार की फ़ाइलें (छवियों, पीडीएफ, वीडियो)CarrierWave: बनाने 1 एकाधिक प्रकार की फ़ाइलें के लिए अपलोड करने वाले

प्रत्येक content_type के लिए विभिन्न कार्यों होगा

मैं क्या कैसे परिभाषित कर सकते हैं के लिए अपलोड करने वाले बनाना चाहते हैं फ़ाइल की content_type?

उदाहरण के लिए:

if image? 
    version :thumb do 
    process :proper_resize  
    end 
elsif video? 
    version :thumb do 
    something 
    end 
end 

उत्तर

9

मैं इस पार आया, और यह कैसे इस समस्या को हल करने का एक उदाहरण की तरह दिखता है: https://gist.github.com/995663

जब आप mount_uploader पर कॉल करते हैं तो अपलोडर पहले लोड हो जाता है, जिस बिंदु पर if image? या elsif video? जैसी चीजें काम नहीं करेंगे, क्योंकि अभी तक परिभाषित अपलोड करने के लिए कोई फ़ाइल नहीं है। कक्षा को तत्काल चालू होने पर आपको कॉल करने के तरीकों की आवश्यकता होगी।

क्या लिंक मैं ऊपर दे दी है, process विधि को फिर से लिखने, इतना है कि यह फ़ाइल एक्सटेंशन की सूची लेता है, और प्रक्रियाओं आपकी फ़ाइल से मेल खाता है केवल यदि उन एक्सटेंशन में से एक

# create a new "process_extensions" method. It is like "process", except 
# it takes an array of extensions as the first parameter, and registers 
# a trampoline method which checks the extension before invocation 
def self.process_extensions(*args) 
    extensions = args.shift 
    args.each do |arg| 
    if arg.is_a?(Hash) 
     arg.each do |method, args| 
     processors.push([:process_trampoline, [extensions, method, args]]) 
     end 
    else 
     processors.push([:process_trampoline, [extensions, arg, []]]) 
    end 
    end 
end 

# our trampoline method which only performs processing if the extension matches 
def process_trampoline(extensions, method, args) 
    extension = File.extname(original_filename).downcase 
    extension = extension[1..-1] if extension[0,1] == '.' 
    self.send(method, *args) if extensions.include?(extension) 
end 

फिर आप उपयोग कर सकते हैं यह क्या

IMAGE_EXTENSIONS = %w(jpg jpeg gif png) 
DOCUMENT_EXTENSIONS = %(exe pdf doc docm xls) 
def extension_white_list 
    IMAGE_EXTENSIONS + DOCUMENT_EXTENSIONS 
end 

process_extensions IMAGE_EXTENSIONS, :resize_to_fit => [1024, 768] 

संस्करणों के लिए की प्रक्रिया हुआ करता था कॉल करने के लिए, वहाँ carrierwave विकी, आप सशर्त प्रक्रिया संस्करणों के लिए अनुमति देता है, तो आप> 0.5.4 पर हैं पर एक पृष्ठ है। https://github.com/jnicklas/carrierwave/wiki/How-to%3A-Do-conditional-processing। आप इस तरह देखने के लिए संस्करण कोड बदलना होगा:

version :big, :if => :image? do 
    process :resize_to_limit => [160, 100] 
end 

protected 
def image?(new_file) 
    new_file.content_type.include? 'image' 
end 
+0

मैं इसे आज़माने के लिए कर रहा था ... मैं अपने जवाब – keithepley

+0

कोई अन्य अपडेट में अपडेट कर देंगे ... पता लगा कि कैसे चुनिंदा का ख्याल रखना संस्करण बनाना – keithepley

+0

बहुत बढ़िया! धन्यवाद! – manzhikov

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