2012-12-28 144 views
6

我工作的一個REST API,試圖上傳的用戶用圖片:上傳文件和回形針

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

我試圖測試回形針與控制器和它的工作,但是當我嘗試通過葡萄API上傳它不工作我的文章標題是多/ form-data的

我對上傳的代碼是這樣

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

因此,如果無法通過葡萄上傳文件,是否有其他方法通過REST API上傳文件?

回答

2

你可以通過你在params[:picture][:tempfile]了作爲回形針有一個適配器File對象File對象,這樣

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

這沒有工作:http://stackoverflow.com/qu estions/15354699/how-do-you-upload-a-file-with-paperclip-without-rails – Chloe

14

@艾哈邁德·謝里夫解決方案的作品,但你失去original_filename(擴建),並能提供探針與預處理器和驗證器。您可以使用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

也許更一致的方式來做到這一點是定義回形針適配器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 

,並用它「透明」

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

已添加到Wiki - https://github.com/intridea/grape/wiki/Uploaded-file-and-paperclip

+0

我們究竟在哪裏放這個? – sunnyrjuneja

+1

它取決於。你可以把這段代碼放在rails的'config/initializers/paperclip_hashie_mash_adapter.rb'上。 或者在rake上使用類似的葡萄:把它放到'lib/paperclip_hashie_mash_adapter.rb'並且在應用程序依賴加載之後,但是在應用程序啓動之前需要它(例如'config/application.rb) –

+0

謝謝,這很有幫助。我使用裝載在Rails上的Grape,所以我只創建了一個初始化程序。 – sunnyrjuneja