2012-12-28 41 views
6

Tôi đang làm việc trên một API REST, cố gắng để tải lên một hình ảnh của người dùng với:tập tin tải lên với nho và kẹp giấy

  • grape vi khuôn khổ
  • paperclip đá quý nhưng nó không làm việc, cho thấy lỗi này
  • ray phiên bản 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">

tôi đã cố gắng thử nghiệm kẹp giấy với một bộ điều khiển và nó làm việc nhưng khi tôi cố gắng để tải lên thông qua api nho nó không làm việc tiêu đề bài viết của tôi là multipart/form-data

Mã của tôi cho việc tải lên là này

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

Vì vậy, nếu không thể tải tệp lên qua nho thì có cách nào khác để tải tệp lên qua REST api không?

Trả lời

2

Bạn có thể vượt qua các đối tượng File bạn có trong params[:picture][:tempfile] như Kẹp giấy có một bộ chuyển đổi cho File đối tượng, như thế này

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

Điều này không hoạt động: http://stackoverflow.com/qu estions/15354699/how-do-you-upload-a-file-với-kẹp giấy-không-đường ray – Chloe

14

@ công trình giải pháp ahmad-Sherif nhưng bạn lỏng lẻo original_filename (và mở rộng) và có thể cung cấp xác định với tiền xử lý và trình xác nhận. Bạn có thể sử dụng ActionDispatch::Http::UploadedFile như thế này:

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

Làm việc như quyến rũ ... –

+0

Cuối cùng, nó hoạt động. Cảm ơn bạn. – Pierre

+0

dễ dàng và làm việc như quyến rũ với carrierwave là tốt! – Carlosin

8

Có lẽ một cách phù hợp hơn để làm điều này sẽ được xác định bộ chuyển đổi kẹp giấy cho Hashie :: Mash

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 

và sử dụng nó "minh bạch"

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

được thêm vào wiki - https://github.com/intridea/grape/wiki/Uploaded-file-and-paperclip

+0

Chúng tôi đặt chính xác điều này ở đâu? – sunnyrjuneja

+1

nó phụ thuộc. bạn có thể đặt mã này vào 'config/initializers/paperclip_hashie_mash_adapter.rb' cho nho trên đường ray. hoặc sử dụng smth tương tự cho nho trên cào: đặt nó vào 'lib/paperclip_hashie_mash_adapter.rb' và yêu cầu sau khi phụ thuộc ứng dụng được tải nhưng trước khi ứng dụng bắt đầu (' config/application.rb' chẳng hạn) –

+0

Cảm ơn, điều đó rất hữu ích. Tôi đang sử dụng Grape gắn trên Rails vì vậy tôi chỉ tạo ra một initializer. – sunnyrjuneja

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