我正在将我的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))
}
都没有工作。
答案 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页面上的注释:
答案 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。