如何使用ruby将base64字符串保存为图像

时间:2009-07-21 18:02:53

标签: ruby-on-rails ruby image file-io base64

我正在将我的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))
}

都没有工作。

4 个答案:

答案 0 :(得分:87)

将二进制数据写入文件时(例如图像的情况),使用IO#puts是危险的,最好避免使用。您应该以二进制模式编写,这种模式与仅支持LF的平台(如UNIX或OS X)无关,但对于Windows等CRLF则必不可少。 IO#puts还会在文件末尾附加一个无效的换行符。

最好的方法是在公开呼叫上指定正确的标志:

File.open('shipping_label.gif', 'wb') do |f|
  f.write(Base64.decode64(base_64_encoded_data))
end

例如,请参阅IO#open documentation页面上的注释:

http://apidock.com/ruby/IO/open/class

答案 1 :(得分:17)

其他答案非常接近,但通常假设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

答案 2 :(得分:6)

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(图片:图片)#save useng paperclip in Photo model

答案 3 :(得分:1)

如果您需要将其写入图像,请使用imagemagick通过rmagick gem。

http://rmagick.rubyforge.org/