2012-12-28 11 views
6

मैं एक REST API पर काम कर रहा हूँ, साथ उपयोगकर्ता की एक तस्वीर अपलोड करने की कोशिश:अपलोड हो रही फ़ाइल अंगूर के साथ और paperclip

  • grape सूक्ष्म ढांचे
  • paperclip मणि लेकिन यह काम नहीं कर रहा, दिखा इस त्रुटि
  • रेल संस्करण 3.2.8

No handler found for #<Hashie::Mash filename="user.png" head="Content-Disposition: form-data; name=\"picture\"; filename=\"user.png\"\r\nContent-Type: image/png\r\n" name="picture" tempfile=#<File:/var/folders/7g/b_rgx2c909vf8dpk2v00r7r80000gn/T/RackMultipart20121228-52105-43ered> type="image/png">

है

मैं एक नियंत्रक के साथ परीक्षण पेपरक्लिप की कोशिश की और यह काम किया है, लेकिन इसके काम नहीं कर रहा है जब मैं अंगूर एपीआई के माध्यम से अपलोड करने की कोशिश मेरी पोस्ट हैडर बहुखण्डीय/फार्म-डेटा

है

अपलोड करने के लिए मेरे कोड इस

user = User.find(20) 
user.picture = params[:picture] 
user.save! 
है

तो यदि अंगूर के माध्यम से फ़ाइलों को अपलोड करना संभव नहीं है तो क्या आरईएसटी एपीआई के माध्यम से फाइल अपलोड करने का कोई वैकल्पिक तरीका है?

उत्तर

2

आप की तरह, File वस्तु आप params[:picture][:tempfile] में मिल गया के रूप में पेपरक्लिप File वस्तुओं के लिए एक एडाप्टर मिल गया पारित कर सकते हैं इस

user.picture = params[:picture][:tempfile] 
user.picture_file_name = params[:picture][:filename] # Preserve the original file name 
+0

यह काम नहीं किया: http://stackoverflow.com/qu एस्ट्रियंस/1535469 9/कैसे-डू-यू-अपलोड-ए-फाइल-पेपरक्लिप-बिना रेल के – Chloe

14

@ अहमद-शरीफ समाधान काम करता है, लेकिन आप ढीला original_filename (और विस्तार) और कहा कि प्रदान कर सकते हैं प्रीप्रोसेसरों और वैधताओं के साथ probems। आप इस तरह ActionDispatch::Http::UploadedFile उपयोग कर सकते हैं:

desc "Update image" 
    params do 
    requires :id, :type => String, :desc => "ID." 
    requires :image, :type => Rack::Multipart::UploadedFile, :desc => "Image file." 
    end 
    post :image do 
    new_file = ActionDispatch::Http::UploadedFile.new(params[:image]) 
    object = SomeObject.find(params[:id]) 
    object.image = new_file 
    object.save 
    end 
+0

आकर्षण की तरह काम किया ... –

+0

अंत में, यह काम करता है। धन्यवाद। – Pierre

+0

आसान और वाहक के साथ आकर्षण की तरह काम किया! – Carlosin

8

शायद

user = User.find(20) 
user.picture = params[:picture] 
user.save! 
यह करने के लिए Hashie :: मैश

module Paperclip 
    class HashieMashUploadedFileAdapter < AbstractAdapter 

    def initialize(target) 
     @tempfile, @content_type, @size = target.tempfile, target.type, target.tempfile.size 
     self.original_filename = target.filename 
    end 

    end 
end 

Paperclip.io_adapters.register Paperclip::HashieMashUploadedFileAdapter do |target| 
    target.is_a? Hashie::Mash 
end 

के लिए पेपरक्लिप अनुकूलक को परिभाषित करने और इसका इस्तेमाल करने के होगा "पारदर्शी" अधिक सुसंगत तरीका

विकी में जोड़ा गया - https://github.com/intridea/grape/wiki/Uploaded-file-and-paperclip

+0

हम इसे कहां रखते हैं? – sunnyrjuneja

+1

यह निर्भर करता है। आप इस कोड को रेल पर अंगूर के लिए 'config/startizers/paperclip_hashie_mash_adapter.rb' पर डाल सकते हैं। या रेक पर अंगूर के लिए समान smth का उपयोग करें: इसे 'lib/paperclip_hashie_mash_adapter.rb' पर रखें और ऐप निर्भरता लोड होने के बाद इसकी आवश्यकता होती है लेकिन एप्लिकेशन शुरू होने से पहले (उदाहरण के लिए' config/application.rb') –

+0

धन्यवाद, यह सहायक था। मैं रेल पर घुड़सवार अंगूर का उपयोग कर रहा हूं इसलिए मैंने अभी एक प्रारंभकर्ता बनाया है। – sunnyrjuneja

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