如何使用ruby保存一个base64string作为图像

我将我的Ruby on Rails应用程序与一个usps运输系统集成在一起。 一旦您提出邮寄要求,您将支付邮资,且不可退款。

邮寄请求将返回一个xml响应,包括一个base64string,这是运输标签。

我能够在视图中呈现运输标签,但是为了使其万无一失,我希望能够将该base64string作为图像保存在我的服务器上,以防发生标签之间发生的任何事情发生(支付为它)和邮件,所以它可能会被重印,而不买一个新的。

我的第一个想法如下

# 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是危险的并且最好避免。 您应该使用二进制模式编写,这在大多数纯UNIX平台(如UNIX或OS X)上都是不相关的,但是在Windows等CRLF平台上却是必不可less的。 IO#puts在该文件的末尾附加了一个换行符,这个换行符是无效的。

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

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

例如,请参阅IO#打开文档页面上的注释:

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

其他答案非常接近,但通常假设base64stream将包含PNG数据。 这并不总是如此,所以我build议使用MIMEtypes库来build立正确的文件扩展名:

 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(图像:图像)#save useng回形针在照片模型

如果你需要把它写到一个图像,然后通过rmagickgem使用imagemagick。

http://rmagick.rubyforge.org/