在Ruby中打开并保存base64编码的图像数据URI

时间:2013-04-14 02:11:53

标签: ruby file base64

从我见过的几个帖子中,我正在尝试这个

x = Base64.decode64("data:image/png;base64,iVBOR....")
File.open('test.png','wb') {|file| file.write x}

但是我不能用观众打开图像,我还需要做更多的事情吗?

4 个答案:

答案 0 :(得分:25)

您的问题是您尝试将'data:image/png;base64,'前缀解码为Base64数据;该前缀是完全有效的Base64数据,但它不是PNG文件的Base64表示。结果是你的test.png文件包含一堆废话,后面跟着一些实际上是PNG文件的位。在解码PNG之前剥去数据URL前缀:

data_url = "data:image/png;base64,iVBOR...."
png      = Base64.decode64(data_url['data:image/png;base64,'.length .. -1])
File.open('test.png', 'wb') { |f| f.write(png) }

答案 1 :(得分:5)

mu_is_too_short答案非常接近,但它假设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 :(得分:1)

您也可以使用简单的String#index方法,而不是使用Regexp

  

返回str中给定子字符串或模式(regexp)的第一个出现的索引。如果找不到,则返回nil。

如果你有一个相当理智的数据源(如.toDataURL()上的JavaScript canvas),你可以依赖普通mimetypes不包含逗号的事实。

dataURL = "data:image/png;base64,iVBOR...."
start = dataURL.index(',') + 1                   # .index used here
x = Base64.decode64 dataURL[start..-1]
File.open('test.png','wb') {|file| file.write x}

如果您正在使用自由格式的用户文件上传,请注意一些不常见的mime类型确实包含逗号(例如:text/x-java-source,java)。你可以使用更保守的:

start = dataURL.index(';base64,') + 8

如果您不知道您是否有无前缀的base64或数据URL base64,您可以使用#index作为测试:

start = dataURL.index ';base64,'
dataURL = dataURL[(start+8)..-1] if start
x = Base64.decode64 dataURL

答案 3 :(得分:0)

这是一个关于如何打开base64图像的小脚本,当我有base64文本时,vacio.txt是文件。

require 'base64'
entry="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQE....."
File.open("vacio.txt","r") do |fichero|
 while linea=fichero.gets
  regex=/(data:image\/\D*\d*,)/
  m=regex.match(linea)
  png=Base64.decode64(linea[m.to_s.length .. -1])
  File.open('test.jpeg','wb'){|f|f.write(png)}
 end
end