2012-04-15 31 views
13

Tôi muốn tải tệp từ máy khách Android lên máy chủ API JSON Rails.tải tệp lên máy chủ API JSON Rails với yêu cầu Paperclip và Multipart

tôi gửi một/form yêu cầu dung nhiều từ khách hàng Android trông như thế:

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-- 

trong bộ điều khiển đường ray tôi đang tạo bài mới với mã này:

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

Tôi làm cách nào để Kẹp giấy ghi lưu tệp đính kèm từ biểu mẫu nhiều phần?

tôi có thể làm điều đó với một cái gì đó như thế này:

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 

nhưng nó không giống như các giải pháp tốt nhất, cũng có thể, tên tập tin đang được thông qua trong ther yêu cầu nhiều phần dữ liệu không được sử dụng.

+0

bất kỳ ý tưởng nào về cách thực hiện việc này? –

Trả lời

4

Vì vậy, tôi đoán mô hình Post của bạn trông giống như sau:

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

Vì vậy, bạn sẽ có thể làm điều gì đó đơn giản như này:

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

Và nó nên lưu hình chụp.

Nếu bạn cần làm điều gì đó phức tạp hơn, hãy thử sắp xếp lại dữ liệu biểu mẫu vào dữ liệu mà định dạng Paperclip mong đợi. Và nếu bạn cần đào sâu hơn, take a look inside Paperclip's Paperclip::Attachment class.

Stack Overflow Cross-Reference

12

Các json cách tinh khiết để làm điều này là không vượt qua content-type nhiều phần dữ liệu dạng và thông qua nội dung tập tin một chuỗi mã hóa base64 trong json.

tôi figured này ra nhờ bài đăng này: http://www.rqna.net/qna/xyxun-paperclip-throws-nohandlererror-with-base64-photo.html

Dưới đây là một ví dụ về 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\"}}}" 

Sau đó, trong quá trình điều khiển các avatar đến như thế này trước khi lưu mô hình.

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

Tính năng này hiện đang hoạt động. Tôi ổn, nhưng ai đó có thể giải thích cho tôi cách thức này có thể hoạt động, rằng chúng tôi thực sự lấp đầy params [: account] [: avatar] với lớp StringIO? –

+1

Điều này là một nửa làm việc cho tôi, nếu hình ảnh quá lớn và do đó là chuỗi base64 sau đó nó bị treo và nâng cao Errno :: E2BIG ngoại lệ. –

+1

Tôi nghĩ rằng nó sạch sẽ hơn với logic này nhiều hơn để mô hình như tài liệu ở đây: http://eggie5.com/54-ios-rails-image-uploads – eggie5

Các vấn đề liên quan