2012-04-15 14 views
13

के साथ रेल JSON API सर्वर पर फ़ाइल अपलोड करने के लिए मैं एक एंड्रॉइड क्लाइंट से एक रेल JSON API सर्वर पर एक फ़ाइल अपलोड करना चाहता हूं।पेपरक्लिप और मल्टीपार्ट अनुरोध

Content-Type: multipart/form-data; boundary=d99ArGa2SaAsrXaGL_AdkNlmGn2wuflo5 
Host: 10.0.2.2:3000 
Connection: Keep-Alive 
User-Agent: Apache-HttpClient/UNAVAILABLE (java 1.4) 

--d99ArGa2SaAsrXaGL_AdkNlmGn2wuflo5 
Content-Disposition: form-data; name="POSTDATA" 
Content-Type: application/json; charset=UTF-8 
Content-Transfer-Encoding: 8bit 

{"tags":["test"],"location_id":1,"post":{"content":"test"}} 
--d99ArGa2SaAsrXaGL_AdkNlmGn2wuflo5 
Content-Disposition: form-data; name="IMAGEDATA"; filename="testimage.jpg" 
Content-Type: image/jpeg 
Content-Transfer-Encoding: binary 

<BINARY DATA? 
--d99ArGa2SaAsrXaGL_AdkNlmGn2wuflo5-- 
रेल नियंत्रक में

मैं इस कोड के साथ नया पद बना रहा हूं:

@parsed_json = JSON(params[:POSTDATA]) 
@post = @current_user.posts.new(@parsed_json["post"]) 

मैं Android ग्राहक जो कि तरह लग रहा है से एक मल्टीपार्ट/प्रपत्र अनुरोध भेज रहा

मैं पेपरक्लिप को मल्टीपार्ट फॉर्म से अनुलग्नक कैसे सहेज सकता हूं?

मैं कुछ इस तरह से यह कर सकते हैं:

if params.has_key?(:IMAGEDATA) 
    photo = params[:IMAGEDATA] 
    photo.rewind 

    @filename = "/tmp/tempfile" 
    File.open(@filename, "wb") do |file| 
     file.write(photo.read) 
    end 

    @post.photo = File.open(@filename) 
    end 

लेकिन यह सबसे अच्छा समाधान है, यह भी, फ़ाइल का नाम है कि वहाँ बहुखण्डीय अनुरोध भेजी जा रही है नहीं किया जाता है की तरह नहीं दिखता।

class Post < ActiveRecord::Base 
    has_attached_file :photo, :styles => { ... } 
    ... 
end 

तो आप इस के रूप में सरल कुछ करने के लिए सक्षम होना चाहिए::

+0

कोई विचार यह कैसे करना है? –

उत्तर

4

तो, मैं अपने Post मॉडल अनुमान है कि इस तरह दिखता है

@post.photo = params[:IMAGEDATA] if params[:IMAGEDATA].present? 
@post.save if @post.valid? 

और यह सहेजना चाहिए तस्वीर।

यदि आपको कुछ और जटिल करने की आवश्यकता है, तो फॉर्म डेटा को उस डेटा में फिर से व्यवस्थित करने का प्रयास करें, जिसे प्रारूप पेपरक्लिप स्वरूपित करता है। और यदि आपको गहरी खुदाई करने की आवश्यकता है, take a look inside Paperclip's Paperclip::Attachment class

स्टैक ओवरफ़्लो परस्पर-संदर्भ

12

शुद्ध json तरीका यह सामग्री प्रकार बहुखण्डीय फार्म गुजरती हैं और के रूप में फ़ाइल पारित नहीं करने के लिए है करने के लिए जेसन में एक बेस 64 एन्कोडेड स्ट्रिंग। http://www.rqna.net/qna/xyxun-paperclip-throws-nohandlererror-with-base64-photo.html

यहाँ json का एक उदाहरण है:

"{\"account\":{\"first_name\":\"John\",\"last_name\":\"Smith\",\"email\":\"[email protected]\",\"password\":\"testtest\",\"avatar\":{\"data\":\"INSERT BASE64 ENCODED STRING OF FILE HERE\",\"filename\":\"avatar.jpg\",\"content_type\":\"image/jpg\"}}}" 

फिर नियंत्रक प्रक्रिया में भेजे अवतार इस तरह मॉडल सहेजने से पहले

मैं इस बाहर धन्यवाद इस पोस्ट लगा।

def process_avatar 
    if params[:account] && params[:account][:avatar] 
    data = StringIO.new(Base64.decode64(params[:account][:avatar][:data])) 
    data.class.class_eval { attr_accessor :original_filename, :content_type } 
    data.original_filename = params[:account][:avatar][:filename] 
    data.content_type = params[:account][:avatar][:content_type] 
    params[:account][:avatar] = data 
    end 
end 
+0

यह अब तक काम कर रहा है। मैं ठीक हूँ, लेकिन क्या कोई मुझे बता सकता है कि यह कैसे काम कर सकता है, कि हम वास्तव में स्ट्रिंगियो कक्षा के साथ पैरा [: खाता] [अवतार] भर रहे हैं? –

+1

यह मेरे लिए आधे काम कर रहा है, अगर तस्वीर बहुत बड़ी है और बेस 64 स्ट्रिंग भी है तो यह क्रैश और एरर्नो :: ई 2 बीआईजी अपवाद को बढ़ाती है। –

+1

मुझे लगता है कि मॉडल के लिए यह तर्क अधिक स्पष्ट है जैसा कि यहां प्रलेखित है: http://eggie5.com/54-ios-rails-image-uploads – eggie5

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