- 使用 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 实际上允许您构建一个附有图像的发布请求。这不是你要找的吗?