8

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

User模型

has_many :departments
accepts_nested_attributes_for :departments

Department模型

has_many :projects
accepts_nested_attributes_for :projects

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

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

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

有什么方法可以将图像嵌入到 json 中,以便我可以使用邮递员休息客户端?

4

1 回答 1

17

- 使用 Base64

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

因此,为了解决这个问题,人们将二进制数据编码为字符。Base64 是这些类型的编码之一。为什么是64?因为您通常可以依赖许多字符集中存在的相同 64 个字符,并且您可以有理由相信您的数据最终会完好无损地传输到线路的另一端。

-- 摘自What is base 64 encoding used for?


因此,一种方法是将 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 回答