8

Rails 3アプリケーションには複数のモデルがあり、各モデルは別のモデルに関連付けられています。

Userモデル

has_many :departments
accepts_nested_attributes_for :departments

Departmentモデル

has_many :projects
accepts_nested_attributes_for :projects

JSONを使用してpostmanRESTクライアントを介してデータを挿入しようとしています。gemUserで処理するモデルに画像アップロードフィールドがあることを除いて、いくつかの形式を見つけました。PaperClip

Railsビューでは正常に機能していますが、postmanを使用して画像をアップロードするにはどうすればよいですか?

RESTクライアントを介してアップロードするには、画像と同等のJSON形式が必要です。

postman restクライアントを使用できるようにjsonに画像を埋め込む方法はありますか?

4

1 に答える 1

17

-Base64 を使用する

Base64とは
ネットワークを介して出荷するバイナリデータがある場合、通常、ビットとバイトを生の形式でネットワーク経由でストリーミングするだけではそれを行いません。なんで?一部のメディアはストリーミングテキスト用に作成されているためです。一部のプロトコルは、バイナリデータを制御文字(モデムなど)として解釈する場合があります。または、基になるプロトコルが特殊文字の組み合わせを入力したと見なす可能性があるため(FTPが行を変換する方法など)、バイナリデータが台無しになる可能性があります。エンディング)。

したがって、これを回避するために、人々はバイナリデータを文字にエンコードします。Base64は、これらのタイプのエンコーディングの1つです。なぜ64?通常、多くの文字セットに存在する同じ64文字に依存することができ、データが破損することなくワイヤの反対側に配置されることを合理的に確信できるためです。

--から引用ベース64エンコーディングは何に使用されますか?


したがって、これを行う1つの方法は、Base64文字列をjsonリクエスト内に配置し、アプリにデコードさせることです。

 # Your request
 {
    'user':{
     # .... 
         'picture':'GIF89a\xB4\x00\x1F\x00\xE7\xFD....'
     }
 }

これがあなたのモデルができることです

 class User < ActiveRecord::Base
   def convert_from_base64(image_data)
     data = StringIO.new(Base64.decode64(image_data))
     data.class.class_eval { attr_accessor :original_filename, :content_type }

     tmp = Tempfile.new("base64")
     tmp.write(data.read)
     tmp.close

     # only on *nix
     data.content_type = IO.popen(["file", "--brief", "--mime-type",tmp.path], 
        in: :close, err: :close).read.chomp
     data.original_filename = "picture." + data.content_type.split("/").last

     data
   end
 end


 # in your controller
 def create
   image_data = JSON.parse(params[:json])['user']['picture'] #or which ever field it is
   params[:user][:picture] = @user.convert_from_base64(image_data)
   # ....  
 end

しかし、POSTMANをざっと見てみると、自分でエンコードを行う必要があることがわかります。


または、データの代わり
にURLを渡すこともできます。URLがネット上で利用可能なリソースを指している場合です。

require "open-uri"

class User < ActiveRecord::Base
  def picture_from_url(url)
    self.picture = open(url)
  end
end
# then just do 
user.picture_from_url params[:user][:photo_url]

Update
Postmanを使用すると、実際には画像を添付して投稿リクエストを作成できます。それはあなたが探しているものではありませんか?

于 2012-12-19T11:42:18.493 に答える