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

Ric*_*cky 49 ruby file-io base64 ruby-on-rails image

我正在将我的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))
}
Run Code Online (Sandbox Code Playgroud)

都没有工作.

tad*_*man 92

将二进制数据写入文件时(例如图像的情况),使用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
Run Code Online (Sandbox Code Playgroud)

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

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


Pio*_*ski 20

其他答案非常接近,但通常假设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
Run Code Online (Sandbox Code Playgroud)


sto*_*nko 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)
Run Code Online (Sandbox Code Playgroud)

kan使用图像作为文件Photo.new(图像:图像)#save useng paperclip在照片模型中