Rails 3 - 使用json上传图片

Cyb*_*ber 8 json ruby-on-rails binary-data paperclip ruby-on-rails-3

在我的Rails 3应用程序中,我有多个模型,每个模型都与另一个模型相关联.

User 模型

has_many :departments
accepts_nested_attributes_for :departments
Run Code Online (Sandbox Code Playgroud)

Department 模型

has_many :projects
accepts_nested_attributes_for :projects
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用JSON 通过邮递员REST客户端插入数据.我找到了一些格式,除了模型中有一个图像上传字段User,我将用PaperClipgem 处理.

通过我的rails视图它工作正常,但如何使用邮递员上传图像?

要通过REST客户端上传,我需要与我的图像等效的JSON格式.

有没有办法在json中嵌入图像所以我可以使用postman rest客户端?

kri*_*ard 17

- 使用Base64

什么是Base64
当您想要通过网络发送某些二进制数据时,通常不会通过以原始格式在线路上传输位和字节来实现.为什么?因为某些媒体是为流文本而制作的.你永远不会知道 - 有些协议可能会将你的二进制数据解释为控制字符(如调制解调器),或者你的二进制数据可能被搞砸了,因为底层协议可能认为你输入了一个特殊的字符组合(比如FTP如何转换行)结局).

因此,为了解决这个问题,人们将二进制数据编码为字符.Base64是这些类型的编码之一.为什么64?因为您通常可以依赖于许多字符集中存在的相同64个字符,并且您可以合理地确信您的数据最终会在线路的另一端不受损坏.

- 取自什么是base 64编码?


因此,一种方法是在您的json请求中放置一个Base64字符串,并让您的应用程序对其进行解码.

 # Your request
 {
    'user':{
     # .... 
         'picture':'GIF89a\xB4\x00\x1F\x00\xE7\xFD....'
     }
 }
Run Code Online (Sandbox Code Playgroud)

这是你的模型可以做的

 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
Run Code Online (Sandbox Code Playgroud)

但是快速查看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]
Run Code Online (Sandbox Code Playgroud)

Update
Postman实际上允许您构建附加图像的发布请求.不是你在找什么?