Frage Datei mit Trauben- und Büroklammer hochladen


Ich arbeite an einer REST API, versuchen, ein Bild des Benutzers hochzuladen mit:

  • Traube Mikro-Rahmen
  • Büroklammer Juwel, aber es funktioniert nicht und zeigt diesen Fehler
  • Schienenversion ist 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">

Ich habe versucht, Büroklammer mit einem Controller zu testen, und es funktionierte, aber wenn ich versuche, über Weintraubenapi zu laden, funktioniert es nicht mein Pfostenheader ist multipart / Form-Daten

Mein Code für den Upload ist dies

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

Wenn es also nicht möglich ist, Dateien per Traube hochzuladen, gibt es eine alternative Möglichkeit, Dateien über REST API hochzuladen?


7
2017-12-28 09:13


Ursprung


Antworten:


@ Ahmad-Sherif Lösung funktioniert, aber Sie verlieren original_filename (und Erweiterung) und das kann Probleme mit Präprozessoren und Validatoren bieten. Sie können verwenden ActionDispatch::Http::UploadedFile so was:

  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

15
2018-06-24 12:46



Vielleicht wäre ein konsistenter Weg, dies zu tun, Papierklammer Adapter für Hashie :: Mash zu definieren

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

und benutze es "transparent"

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

zum Wiki hinzugefügt - https://github.com/intridea/grape/wiki/Uploaded-file-and-paperclip


8
2017-11-16 01:35



Du kannst die File Objekt, das du bekommen hast params[:picture][:tempfile] wie Paperclip bekam einen Adapter für File Objekte, so

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

2
2017-12-28 12:49