2013-05-09 8 views
5

के साथ सहेजने से पहले फ़ाइल नाम संशोधित करें मेरे पास एक अपलोडर है जहां मैंने कस्टम और अद्वितीय फ़ाइल नाम प्राप्त करने के लिए # फ़िलनाम विधि को कार्यान्वित किया है, लेकिन ऐसा लगता है कि फ़ाइल को सहेजने से पहले इस विधि को अनदेखा किया गया है (मैं रैकस्पेस पर अपलोड कर रहा हूं यहाँकैरियरवेव

class MyImageUploader < CarrierWave::Uploader::Base 
    include CarrierWave::RMagick 

    ... 

    def filename 
    if original_filename.present? 
     "#{secure_token}.#{file.path.split('.').last.downcase}" 
    else 
     super 
    end 
    end 

    ... 

    private 

    def secure_token 
    var = :"@#{mounted_as}_secure_token" 
    model.instance_variable_get(var) or model.instance_variable_set(var, SecureRandom.uuid) 
    end 
end 

और कंसोल में एक परीक्षण (मुझे लगता है कि मैंने सोचा था कि कस्टम #filename विधि के साथ हल किया गया था बड़े फ़ाइल नामों के साथ एक मुद्दा परीक्षण कर रहा हूँ) है: कोहरे मणि)

यहाँ अपलोड करने वाले है :

1.9.3-p392 :002 > f = File.open('/Users/myuser/Desktop/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.png') 
=> #<File:/Users/myuser/Desktop/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.png> 
1.9.3-p392 :003 > my_model_instance.image = f 
Errno::ENAMETOOLONG: File name too long - /Users/myuser/app/tmp/uploads/20130509-1723-16769-8458/thumb_lolcat4lolcat4lolcat4lolcat4lolcat4lolcat4lolcat4lolcat4lolcat4lolcat4lolcat4lolcat4lolcat4lolcat4lolcat4lolcat4lolcat4lolcat4lolcat4lolcat4lolcat4lolcat4lolcat4lolcat4lolcat4lolcat4lolcat4lolcat4lolcat4lolcat4lolcat4lolcat4lolcat4lolcat4lolcat4lolcat.png 
    from /Users/myuser/.rvm/rubies/ruby-1.9.3-p392/lib/ruby/1.9.1/fileutils.rb:1371:in `initialize' 
    from /Users/myuser/.rvm/rubies/ruby-1.9.3-p392/lib/ruby/1.9.1/fileutils.rb:1371:in `open' 
    from /Users/myuser/.rvm/rubies/ruby-1.9.3-p392/lib/ruby/1.9.1/fileutils.rb:1371:in `block in copy_file' 
    from /Users/myuser/.rvm/rubies/ruby-1.9.3-p392/lib/ruby/1.9.1/fileutils.rb:1370:in `open' 
    from /Users/myuser/.rvm/rubies/ruby-1.9.3-p392/lib/ruby/1.9.1/fileutils.rb:1370:in `copy_file' 
    from /Users/myuser/.rvm/rubies/ruby-1.9.3-p392/lib/ruby/1.9.1/fileutils.rb:477:in `copy_file' 
    from /Users/myuser/.rvm/rubies/ruby-1.9.3-p392/lib/ruby/1.9.1/fileutils.rb:396:in `block in cp' 
    from /Users/myuser/.rvm/rubies/ruby-1.9.3-p392/lib/ruby/1.9.1/fileutils.rb:1515:in `block in fu_each_src_dest' 
    from /Users/myuser/.rvm/rubies/ruby-1.9.3-p392/lib/ruby/1.9.1/fileutils.rb:1531:in `fu_each_src_dest0' 
    from /Users/myuser/.rvm/rubies/ruby-1.9.3-p392/lib/ruby/1.9.1/fileutils.rb:1513:in `fu_each_src_dest' 
    from /Users/myuser/.rvm/rubies/ruby-1.9.3-p392/lib/ruby/1.9.1/fileutils.rb:395:in `cp' 
    from /Users/myuser/.rvm/gems/[email protected]/gems/carrierwave-0.6.2/lib/carrierwave/sanitized_file.rb:205:in `copy_to' 
    from /Users/myuser/.rvm/gems/[email protected]/gems/carrierwave-0.6.2/lib/carrierwave/uploader/cache.rb:121:in `block in cache!' 
    from /Users/myuser/.rvm/gems/[email protected]/gems/carrierwave-0.6.2/lib/carrierwave/uploader/callbacks.rb:17:in `with_callbacks' 
    from /Users/myuser/.rvm/gems/[email protected]/gems/carrierwave-0.6.2/lib/carrierwave/uploader/cache.rb:112:in `cache!' 
    from /Users/myuser/.rvm/gems/[email protected]/gems/carrierwave-0.6.2/lib/carrierwave/uploader/versions.rb:231:in `block in cache_versions!' 
    from /Users/myuser/.rvm/gems/[email protected]/gems/carrierwave-0.6.2/lib/carrierwave/uploader/versions.rb:216:in `each' 
    from /Users/myuser/.rvm/gems/[email protected]/gems/carrierwave-0.6.2/lib/carrierwave/uploader/versions.rb:216:in `cache_versions!' 
    from /Users/myuser/.rvm/gems/[email protected]/gems/carrierwave-0.6.2/lib/carrierwave/uploader/callbacks.rb:18:in `block in with_callbacks' 
    from /Users/myuser/.rvm/gems/[email protected]/gems/carrierwave-0.6.2/lib/carrierwave/uploader/callbacks.rb:18:in `each' 
    from /Users/myuser/.rvm/gems/[email protected]/gems/carrierwave-0.6.2/lib/carrierwave/uploader/callbacks.rb:18:in `with_callbacks' 
    from /Users/myuser/.rvm/gems/[email protected]/gems/carrierwave-0.6.2/lib/carrierwave/uploader/cache.rb:112:in `cache!' 
    from /Users/myuser/.rvm/gems/[email protected]/gems/carrierwave-0.6.2/lib/carrierwave/mount.rb:315:in `cache' 
    from /Users/myuser/.rvm/gems/ruby-1.[email protected]/gems/carrierwave-0.6.2/lib/carrierwave/mount.rb:173:in `image=' 
    from /Users/myuser/.rvm/gems/[email protected]/bundler/gems/carrierwave-mongoid-28a9b718d42b/lib/carrierwave/mongoid.rb:39:in `image=' 

तो मुझे लगता है कि मैं पूरी तरह से काम कर रहा है, क्योंकि वास्तव में फ़ाइल केवल रैकस्पेस (केवल यदि फ़ाइल नाम यह इतनी बड़ी नहीं है)

उत्तर

4

पर अपलोड किए जाने के बाद नाम बदलने है कस्टम फ़ाइल नाम प्राप्त करने के लिए सहेजा जा रहा से पहले फ़ाइल नाम संशोधित करने की आवश्यकता अपलोडिंग चरण (जो धुंध में होता है) के बजाय कैशिंग चरण (जो स्थानीय रूप से होता है) के दौरान अपलोड विस्फोट कर रहा है। the source पढ़ना, ऐसा लगता है कि कैरियरवेव में एक तरीका है जिसे आप केवल यह करने के लिए ओवरराइड कर सकते हैं: full_original_filename

यदि समस्या हल करने का प्रयास कर रहे हैं तो कैश किए गए फ़ाइल नाम को कम करना है, निम्नलिखित कार्य कर सकते हैं। यदि आप बाद में उस फ़ाइल नाम को बदलना चाहते हैं, तो आपको इसके अलावा official solution for that का उपयोग करना होगा।

MAX_FILENAME_LENGTH = 64 # arbitrary limit, your milage may vary 

def full_original_filename 
    filename = super 

    return filename if !filename.present? 

    extension = File.extname(filename) 
    basename = File.basename(filename, extension)[0...MAX_FILENAME_LENGTH] 
    basename + extension 
end 
+0

हाय तावो, सहायता के लिए धन्यवाद। आपका परिवर्तन प्रभावी रूप से पढ़ने से पहले स्थानीय फ़ाइल नाम अपडेट करता है लेकिन ऐसा लगता है कि मुझे फ़ाइल को पहले स्थानांतरित करने की आवश्यकता है क्योंकि मुझे "ऐसी कोई फ़ाइल या निर्देशिका" त्रुटि नहीं मिलती है जो नए फ़ाइल नाम को इंगित कर रहा है:/उपयोगकर्ता/myuser/app/tmp/uploads /20130510-1222-59710-2769/4f7dfe24-c39c-4cda-bf99-ed09cea0a162.png – rdavila

+0

मैंने एक वैकल्पिक कार्यान्वयन लिखा है जो काम कर सकता है, लेकिन मुझे संदेह है कि यह आपके मुद्दे को भी हल नहीं करेगा। मैंने इसका परीक्षण नहीं किया है ... – Taavo

+0

यह काम करता है। धन्यवाद तावो !!! – rdavila

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