2012-04-20 17 views
10

के लिए पथ प्रारूप मैं एक avatar पेपरक्लिप के साथ एक मॉडल संलग्न है: एक से मौजूदा फ़ाइलों प्रवास के। अब यह एक सादा मानक पथपेपरक्लिप + S3: एक और

has_attached_file :avatar, 
    :path => "/:id-:style-:filename" 

कौन सा मैं एक अस्पष्ट एक

has_attached_file :avatar, 
    :path => "/:id-:hash.:extension" 
    :hash_secret => 'asecuresecret' 

सब कुछ नया छवियों के साथ ठीक काम कर रहा में ले जाना होगा है, लेकिन मैं कैसे करने के लिए S3 में संग्रहीत मौजूदा फ़ाइलों की ओर पलायन करते हैं नया पथ प्रारूप, यानी उनका नाम बदलें?

मैं पेपरक्लिप 2.7 उपयोग कर रहा हूँ और रेल 3.2

धन्यवाद !!!

+0

रुचि रखने वालों के लिए हैश से गैर-हैश तक जाने के लिए थोड़ा और दिलचस्प है और माइग्रेशन बनाने के लिए मुझे एक नया 'has_attached_file' बनाना है। –

उत्तर

3

इस रेक कार्य को चाल करना चाहिए। मैंने इसे aws-sdk 1.5.2 और ruby ​​1.9.3p194 के साथ करने की कोशिश की।

new_key अपने नए पेपर क्लिप पथ के लिए नक्शे चाहिए। अपनी आवश्यकताओं के अनुसार :acl सेट करना न भूलें।

namespace :data do 
    desc 'aws images migration' 
    task :migrate_images do |t, args| 
    s3 = AWS::S3.new(:access_key_id => 'XXX', :secret_access_key => 'XXX') 
    bucket = s3.buckets['your-bucket-name'] 
    bucket.objects.each do |object| 
     new_key = object.key.gsub(........) 
     new_object = bucket.objects[new_key] 
     object.copy_to new_object, {:acl => :public_read} 
    end 
    end 
end 

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

+0

'aws-sdk'' के साथ परीक्षण किया गया 1।26 और रूबी 2.0। स्वीकृति में देरी के लिए धन्यवाद और खेद है! – dgilperez

0

मैं (यदि आप चाहें, रेल संदर्भ में चलाने के लिए या सिर्फ एक सादे लिपि) एक रेक कार्य लिखेंगे। यदि आप aws-s3 मणि का उपयोग कर रहे हैं, तो मॉडल के उदाहरणों पर पुनरावृत्त करें, जिन्हें आप जानते हैं कि उनके पास पुराना पथ प्रारूप है या फ़ाइल मिलान पर कुछ शर्त लिखने का प्रयास करें, और एक-एक करके कदम उठाएं।

Model.find_in_batches(:batch_size => 500, 
     :conditions => "avatar_filename like 'SOMETHING_MATCHING'") do |o| 
    AWS::S3::S3Object.rename(old_path(o.avatar), o.avatar.url, 'BUCKET_NAME') 
end 

आप पहले से ही नया पथ परिभाषा के साथ अवतार कॉन्फ़िगर किया है, एक विधि है कि अवतार गुणों के आधार पर पुराने पथ निर्माण कर सकते हैं लिखें।

आप अपने एस 3 खाते से कनेक्शन स्थापित करने के तरीके को देखने के लिए aws-s3 मणि दस्तावेज़ here पढ़ सकते हैं।

9

यदि आप केवल पेपरक्लिप के साथ काम करना चाहते हैं और आप फिर से अपलोड करने के बारे में चिंतित नहीं हैं, तो मैंने एक और दृष्टिकोण का पालन किया।

आपके पास लगता है निम्नलिखित हैं:

class User 
    has_attached_file :image, path: "/:old_path/:filename" 
    ... 
end 

और आप नए पथ के लिए स्थानांतरित करना चाहते हैं: "/:new_path/:filename"

मेरे सुझाव पुराने पथ के साथ एक FakeUser बना सकते हैं और उपयोगकर्ता में इसे बदलने के लिए है आदर्श।

FakeUser.find_each do |fake_user| 
    User.find(fake_user.id).update(image: fake_user.image) 
    fake_user.image.destroy 
end 

फिर आप FakeUser मॉडल माइग्रेशन समाप्त हो गया है हटा सकते हैं:

class FakeUser 
    self.table_name = :users 
    has_attached_file :image, path: "/:old_path/:filename" 
    ... 
end 

class User 
    has_attached_file :image, path: "/:new_path/:filename" 
    ... 
end 

अब आप निम्न माइग्रेशन लिख सकते हैं।

वैसे, यह दृष्टिकोण स्थानीय फाइल सिस्टम से S3 या इसके विपरीत में माइग्रेट करने के लिए पूरी तरह से काम करेगा।

+3

यह मेरे लिए काम करता था, मैं असली मॉडल 'वर्ग FakeUser <उपयोगकर्ता' – silva96

+0

से नकली मॉडल को विरासत में प्राप्त करके इसे सरल बना सकता हूं, आपकी सभी फ़ाइलों को माइग्रेट करने के लिए बहुत अच्छा समाधान! मैंने जो स्क्रिप्ट देखी हैं उससे बेहतर। –

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