[英]How to save a base64 string as an image using ruby
我正在将我的 Ruby on Rails 应用程序与 usps 运输系统集成。 一旦您提出邮资请求,您就需要支付该邮资并且不予退还。
邮资请求将返回一个 xml 响应,其中包含一个 base64 字符串,即发货标签。
我能够在视图中呈现运输标签,但是为了使其万无一失,我希望能够将该 base64 字符串保存为我的服务器上的图像,以防在代之间运输标签发生某些事情(付费为它)和邮寄,这样它就可以重印而无需购买新的。
我的第一个想法如下
# Attempt 1
File.open('shipping_label.gif', 'w+') {|f|
f.puts Base64.decode64(base_64_encoded_data)
}
# Attempt 2
File.open('shipping_label.gif', 'w+') {|f|
f.puts Base64.decode64(Base64.decode64(base_64_encoded_data))
}
都不工作。
将二进制数据写入文件时(例如图像的情况),您不能使用IO#puts
等文本打印工具。
您需要确保两件事:
write
而不是puts
因为write
可以处理任意数据,但puts
(字面意思是“放置字符串”)专门用于文本。结合这些你得到:
File.open('shipping_label.gif', 'wb') do |f|
f.write(Base64.decode64(base_64_encoded_data))
end
其他答案非常接近,但通常假设 base64 流将包含 PNG 数据。 情况并非总是如此,因此我建议使用 MIME 类型库来建立正确的文件扩展名:
REGEXP = /\Adata:([-\w]+\/[-\w\+\.]+)?;base64,(.*)/m
data_uri_parts = data_url.match(REGEXP) || []
extension = MIME::Types[data_uri_parts[1]].first.preferred_extension
file_name = "myfilename.#{extension}"
File.open(file_name, 'wb') do |file|
file.write(Base64.decode64(data_uri_parts[2]))
end
require 'RMagick'
data = params[:image_text]# code like this data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABPUAAAI9CAYAAABSTE0XAAAgAElEQVR4Xuy9SXPjytKm6ZwnUbNyHs7Jc7/VV9bW1WXWi9q
image_data = Base64.decode64(data['data:image/png;base64,'.length .. -1])
new_file=File.new("somefilename.png", 'wb')
new_file.write(image_data)
在您可以将图像用作文件后 Photo.new(image: image)#save 在照片模型中使用回形针
如果您需要将其写入图像,请通过 rmagick gem 使用 imagemagick。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.