63

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

4 回答 4

104

将二进制数据写入文件时,例如图像的情况,您不能使用文本打印工具,如IO#puts.

您需要确保两件事:

  • 您需要以二进制模式编写以避免任何可能的 LF 到 CRLF 扩展。
  • 您必须使用write而不是putsaswrite可以处理任意数据,但puts(字面意思是“放置字符串”)专门用于文本。

结合这些你得到:

File.open('shipping_label.gif', 'wb') do |f|
  f.write(Base64.decode64(base_64_encoded_data))
end
于 2009-07-21T19:00:04.993 回答
25

其他答案非常接近,但通常假设 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
于 2016-02-20T00:55:21.643 回答
7
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 在照片模型中使用回形针

于 2014-12-11T15:40:44.327 回答
1

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

http://rmagick.rubyforge.org/

于 2009-07-21T19:41:55.483 回答