2013-07-14 7 views
5

मेरे रेल ऐप में, मैं अमेज़ॅन एस 3 पर छवियों को अपलोड करने के लिए कैरियरवेव का उपयोग कर रहा हूं। मैं छवि को दोबारा अपलोड किए बिना मौजूदा अमेज़ॅन एस 3 छवियों को इंगित करना चाहता हूं। उदाहरण के लिए, यदि मेरे पास http://test.s3.amazonaws.com/image/path/0001/image.jpg पर मौजूदा अमेज़ॅन S3 छवि है, तो क्या मैं इस छवि को इंगित करने के लिए किसी छवि के पथ को अपडेट कर सकता हूं? मैं रिमोट अपलोड विकल्प का उपयोग नहीं करना चाहता क्योंकि मैं वास्तव में वही सटीक छवि का उपयोग करना चाहता हूं जो पहले से मौजूद है (लेकिन इसे मेरे रिकॉर्ड के "पथ" विशेषता में सहेजें)।कैरियरवेव: मौजूदा छवि को इंगित करें

कंसोल में, मैं कोशिश की है:

image.update_attributes(:path=> "http://test.s3.amazonaws.com/image/path/0001/image.jpg") 

लेकिन इस छवि के पथ ओवरराइड करने के लिए विफल रहता है।

+0

आप इसे कैसे हल करने में सक्षम थे? – Mohamad

+0

मैंने एक नया रिकॉर्ड नहीं बनाया और बस मूल रिकॉर्ड को इंगित किया। – scientiffic

+0

हाय @ वैज्ञानिक क्या आपको इसके लिए समाधान मिला है? मैं आपकी प्रतिक्रिया के लिए बहुत दिलचस्प – medBo

उत्तर

0

मैंने पाया कि आप वास्तव में उदाहरण के लिए ऐसा कर सकते हैं, यदि आपका mount_uploader, :path है तो:

image.remote_path_url = "http://test.s3.amazonaws.com/image/path/0001/image.jpg" 
image.save 
+0

धन्यवाद। जैसा कि मैंने अपनी मूल पोस्ट में उल्लेख किया है, मैं फ़ाइल को फिर से अपलोड नहीं करना चाहता था, जो मुझे विश्वास है कि आप remote_path_url के साथ क्या कर रहे हैं और सहेज सकते हैं। – scientiffic

+0

कोई कारण नहीं है कि आप फ़ाइल को दोबारा अपलोड नहीं करना चाहते हैं? मेरे मामले में, यह मौजूदा फ़ाइल को प्रतिस्थापित करेगा और यह स्थानीय मशीन से अपलोड करने के बजाय अभी भी तेज़ है। दुर्भाग्य से मुझे नहीं लगता कि ऐसा करने के बिना वाहक के लिए कोई वैकल्पिक तरीका है। – shinnyx

+0

मैंने पाया कि फ़ाइल को दोबारा अपलोड करना मेरे आवेदन के लिए बहुत धीमा था। इसके बजाए, मैं सिर्फ यह पता लगाता हूं कि नया रिकॉर्ड किसी अन्य छवि को इंगित करता है या नहीं, छवि को दृश्य में बदलता है (मेरे डेटाबेस के बजाए)। – scientiffic

2

मैं पार्टी के लिए थोड़ी देर हो चुकी हूँ, लेकिन आप की तरह सक्रिय रिकॉर्ड के raw_write_attribute विधि कुछ का उपयोग कर सकते हैं:

@ image.raw_write_attribute (: पथ, "http://test.s3.amazonaws.com/image/path/0001/image.jpg")

+0

जहां तक ​​मैं कह सकता हूं, यह डीबी को मान नहीं बचाता है, और आपको इसे @ image.save के साथ डीबी में लिखने की अनुमति भी नहीं देता है, क्योंकि जहां तक ​​मॉडल का संबंध है, वहां कुछ भी नहीं है बचाना! – Daniel

3

में घंटी, कभी नहीं की तुलना में बेहतर देर से! चेतावनी: यह रेल 4 के लिए है, और मैं केवल इस समय रेल 4.1 पर परीक्षण कर रहा हूं।

यह कठिन है, मेथिंक होना चाहिए! कारण यह मेरे लिए बिल्कुल महत्वपूर्ण था कि क्लाउडफ्लारे एसएसएल सीमाओं (और सामान्य ज्ञान) के कारण, मैं 100 एमबी + एमपी 3 फाइलों को जोड़ रहा हूं, जिन्हें मैं अपने मेजबान पर प्राप्त नहीं कर सकता। सौभाग्य से, एडब्ल्यूएस preauthorized अपलोड का समर्थन करता है, और मैं मेरे लिए सही काम करने के लिए carrierwave मिला:

चरण 1:

m.raw_write_attribute('file','file.mp3'); 
url = m.file.url 
signed = aws_presigned_url(url) 

raw_write_attribute करता है: carrierwave मुझे बताने की जहां यह करता है, तो यह हो सकता एक फ़ाइल संग्रहीत करेंगे मिल कुछ भी बचाओ नहीं, यह मूल्य निर्धारित करते समय कैरियरवेव को छोड़ देता है। इससे ऑब्जेक्ट कार्य करता है जैसे कि यह डेटाबेस से 'file.mp3' पढ़ता है। फिर आप कैरियरवेव से पूछ सकते हैं "जहां फाइल रहता है"। मैं फिर सीधे क्लाइंट से S3 तक फ़ाइल अपलोड करता हूं।

m.raw_write_attribute('file','file.mp3'); 
m.update_attribute('file','file.mp3'); 

इन दो Carrierwave आसपास बनती मिलती है: यह काम होने पर, मैं रेल के लिए एक और API कॉल है, जो निम्नलिखित कोड प्रदर्शन करती हैं। पहला वाहकवेव सोचता है कि 'फ़ाइल' कॉलम 'file.mp3' पर सेट है, दूसरा स्पष्ट रूप से डीबी को 'file.mp3' को बनाए रखने के लिए रेल बताता है। raw_write_attribute कॉल के कारण, कैरियरवेव दूसरे को अन-बदले में अनुमति देता है।

2

मेरे मामले update_column और update_columns में महान काम किया:

model.update_columns file_1: 'filename.txt' 

अद्यतन स्तंभ अल्पविराम के साथ है:

model.update_column :file_1, 'filename.txt' 

यह filename.txt के लिए किसी भी कॉलबैक और स्तंभ सेट नहीं चलेंगे।

जब मैं model.file_1.url करता हूं तो मुझे सही S3 यूआरएल मिलता है।

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