如何使用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#打开文档页面上的注释:
其他答案非常接近,但通常假设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。